CodeGym/Java Blogu/Rastgele/Java String.split() yöntemi
John Squirrels
Seviye
San Francisco

Java String.split() yöntemi

grupta yayınlandı
Java'nın String.split yöntemi hakkında konuşalım : ne yapar ve neden gereklidir. Bir Java dizesini böldüğünü tahmin etmek zor değil, ancak bu pratikte nasıl çalışıyor? Yöntemin işleyişine derinlemesine dalalım ve bazı bariz olmayan ayrıntıları tartışalım. Aynı zamanda, String'in gerçekte kaç tane split metodu olduğunu öğreneceğiz . Hadi gidelim!

Java'nın String.split'i için açıklama ve imza

Java'da split yöntemi, normal bir ifade kullanılarak tanımlanan bir sınırlayıcı kullanarak bir dizeyi alt dizelere böler. Yöntem imzasını sunalım ve dalışımıza başlayalım:
String[] split(String regex)
İmzadan iki şey anlaşılıyor:
  1. Yöntem, bir dizi dize döndürür.
  2. Yöntem, normal ifade adı verilen bir dize giriş parametresine sahiptir .
Yukarıda verilen açıklamayı parçalara ayırırken bunların her birini ayrı ayrı analiz edelim.
  1. Yöntem, bir dizi dize döndürür.

    Bildirim şu sözcükleri içerir: "Java'da, split yöntemi bir diziyi alt dizilere böler." Yöntem, bu alt dizeleri, dönüş değeri haline gelen bir dizide toplar.

  2. Yöntem, normal ifade adı verilen bir dize giriş parametresine sahiptir .

    Yine, açıklamayı hatırlayın: "bir dizeyi, normal bir ifade kullanılarak tanımlanan bir sınırlayıcı kullanarak alt dizelere böler." Normal ifade giriş parametresi , orijinal dizeye uygulanan normal bir ifadedir. Karakter veya karakter kombinasyonu eşleştiğinde, sınırlayıcı olarak kabul edilirler.

Java'daki String.split() yöntemi: bir dizeyi parçalara bölme - 1

Java'nın pratikte bölünmesi

Şimdi konuya yaklaşalım. Bir dizi kelimemiz olduğunu hayal edelim. Örneğin, bunun gibi:
Java'yı seviyorum
Dizeyi kelimelere ayırmamız gerekiyor. Bu dizideki kelimelerin birbirinden boşluklarla ayrıldığını görüyoruz. Bu durumda, bir boşluk karakteri sınırlayıcımız için mükemmel bir adaydır. Görevimizi çözme kodu şöyle görünür:
public class Main {
    public static void main(String[] args) {
        String str = "I love Java";
        String[] words = str.split(" ");
        for (String word : words) {
            System.out.println(word);
        }
    }
}
Ana yöntemin çıktısı aşağıdaki satırlar olacaktır:
Java'yı seviyorum
Split yönteminin nasıl çalışacağına dair birkaç örnek daha görelim :
Sicim Sınırlayıcı Yöntemin sonucu
"Java'yı seviyorum" " " (boşluk karakteri) { "Ben" , "aşk" , "Java" }
"192.168.0.1:8080" ":" { "192.168.0.1" , "8080" }
"Kırmızı, turuncu, sarı" "," { "Kırmızı" , "turuncu" , "sarı" }
"Kırmızı, turuncu, sarı" ", " { "Kırmızı" , "turuncu" , "sarı" }
Yukarıdaki tabloda son iki satır arasındaki farklara dikkat edin. Sondan ikinci satırda sınırlayıcı olarak virgül kullanılır. Sonuç olarak, dize bölündüğünde, bazı kelimelerin başında boşluklar bulunur. Son satırda sınırlayıcı olarak virgül ve boşluk kullandık. Bu nedenle ortaya çıkan dizide başında boşluk olan alt diziler yoktu. Bu, doğru sınırlayıcıyı dikkatli bir şekilde seçmenin ne kadar önemli olduğunu gösteren ince bir ayrıntıdır.

Baş sınırlayıcı

Bu başka bir önemli nüans. Orijinal dize sınırlayıcı ile başlıyorsa, sonuç dizisinin ilk öğesi boş bir dize olacaktır. Örneğin, şuna benzer: Orijinal dize: " Java'yı seviyorum" Ayırıcı: " " Ortaya çıkan dizi: { "", "I", "aşk", "Java" } Ancak orijinal dize bir sınırlayıcıyla bitiyorsa bir ile başlamak yerine, sonuç farklı olacaktır: Orijinal dize: "Java'yı seviyorum " Sınırlayıcı: " " Sonuç dizisi: { "I", "love", "Java"
public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" "));
        print(" I love Java".split(" "));
        print("I love Java ".split(" "));
        print(" I love Java ".split(" "));
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
Ana yöntemin çıktısı şöyle olacaktır :
[Ben, aşk, Java] [, ben, aşk, Java] [Ben, aşk, Java] [, ben, aşk, Java]
Orijinal dizideki ilk karakter sınırlayıcı bir karakter olduğunda, dizideki ilk öğenin boş bir dize olacağı gerçeğine tekrar dikkat edin.

aşırı yüklenmiş kardeş

String sınıfı , aşağıdaki imzaya sahip başka bir split yöntemine sahiptir :
String[] split(String regex, int limit)
Bu yöntemin ek bir limit parametresi vardır: regex deseninin orijinal dizgeye kaç kez uygulanacağını belirler . Aşağıdaki açıklamalara bakın:

sınır > 0

Model limit -1 kez uygulanır. Ayrıca, döndürülen dizinin uzunluğu limit parametresinin değerini aşamaz . Dizinin son öğesi, dizenin sınırlayıcının bulunduğu son yeri takip eden kısmı olacaktır. Örnek:
public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" ", 1));
        print("I love Java".split(" ", 2));
        /*
         Output:
         [I love Java]
         [I, love Java]
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

sınır < 0

Ayırıcı normal ifadesi, dizeye mümkün olduğu kadar çok kez uygulanır. Ortaya çıkan dizi herhangi bir uzunluğa sahip olabilir. Örnek:
public class Main {
    public static void main(String[] args) {
        // Note the space at the end of the string
        print("I love Java ".split(" ", -1));
        print("I love Java ".split(" ", -2));
        print("I love Java ".split(" ", -12));
        /*
         Output:
        [I, love, Java, ]
        [I, love, Java, ]
        [I, love, Java, ]

        Please note that the last element of the array is
        an empty string. This is caused by the whitespace
        at the end of the original string.
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

sınır = 0

Limitin < 0 olduğu durumda olduğu gibi , sınırlayıcı model diziye mümkün olduğu kadar çok kez uygulanır. Son dizinin herhangi bir uzunluğu olabilir. Son elemanlar boş dizeler ise, son diziden atılırlar. Örnek:
public class Main {
    public static void main(String[] args) {
        // Note the space at the end of the string
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        /*
         Output:
        [I, love, Java]
        [I, love, Java]
        [I, love, Java]
        Note the absence of empty strings at the end of the arrays
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
Split yönteminin tek parametreli sürümünün uygulanmasına göz atarsak , bunun aşırı yüklenmiş kardeşi gibi olduğunu görebiliriz, ancak ikinci argüman sıfıra ayarlanmış:
public String[] split(String regex) {
    return split(regex, 0);
}

Çeşitli örnekler

Gerçek dünya pratiğinde, bazen belirli kurallara göre üretilmiş dizilerimiz olur. Böyle bir dizi programımıza herhangi bir yerden gelebilir:
  • üçüncü taraf bir hizmetten;
  • sunucumuza gönderilen bir istekten;
  • bir yapılandırma dosyasından;
  • ve benzeri.
Bu durumlarda, programcı genellikle "oyunun kurallarını" bilir. Diyelim ki bir programcı, bu kalıba göre saklanan kullanıcı bilgileriyle uğraştığını biliyor:
user_id|user_login|user_email
Örnek olarak bazı belirli değerleri ele alalım:
135|bükücü|bükücü@gmail.com
Programcının görevinin, kullanıcıya bir e-posta gönderen bir yöntem yazmak olduğunu varsayalım. Programcının, yukarıda verilen formatta kaydedilen kullanıcı verilerine erişimi vardır. Şimdi analiz etmeye devam edeceğimiz alt görev, e-posta adresini diğer kullanıcı verilerinden nasıl izole edeceğimizdir. Bu, split yönteminin yararlı olabileceği bir örnektir . Sonuçta, kullanıcı verileri şablonuna bakarsak, geri kalanından kullanıcının e-posta adresini çıkarmanın, dizeyi bölmek için split yöntemini çağırmak kadar basit olduğunu fark ederiz. Ardından, e-posta adresi, ortaya çıkan dizinin son öğesinde olacaktır. Aşağıda, kullanıcı verilerini içeren bir dize alan ve kullanıcının e-posta adresini döndüren bir yöntem örneği verilmiştir. Basit olması için, veri dizisinin her zaman istediğimiz biçimde olduğunu varsayalım:
public class Main {
    public static void main(String[] args) {
        String userInfo = "135|bender|bender@gmail.com";
        System.out.println(getUserEmail(userInfo));
        // Output: bender@gmail.com
    }

    static String getUserEmail(String userInfo) {
        String[] data = userInfo.split("\\|");
        return data[2]; // or data[data.length - 1]
    }
}
Sınırlayıcıya dikkat edin: "\\|" . Normal ifadelerde "|" özel anlamı olan özel bir karakterdir, bu yüzden onu sıradan bir karakter olarak kullanmak istiyorsak (yani orijinal dizgede bulmak istediğimiz şey), o zaman karakterden iki ters eğik çizgi ile kaçmamız gerekir. Başka bir örnek düşünün. Diyelim ki şu şekilde yapılandırılmış sipariş bilgilerimiz var:
item_number_1,item_name_1,item_price_1;item_number_2,item_name_2,item_price_2;...;item_number_n,item_name_n,item_price_n
Veya bazı özel değerleri bile benimseyebiliriz:
1,salatalık,2,39;2,domates,1,89;3,domuz pastırması,4,99
Görevimiz, siparişin toplam maliyetini hesaplamaktır. Burada split yöntemini birkaç kez uygulamamız gerekecek . İlk adım, dizgiyi ";" kullanarak ayırmaktır. onu bileşen parçalarına ayırmak için sınırlayıcı olarak. Ardından, ortaya çıkan her alt dizi, daha sonra işleyebileceğimiz ayrı bir ürün hakkında bilgi tutacaktır. Ardından, her ürün için ilgili bilgileri "," sembolünü kullanarak ayıracağız. Ortaya çıkan dizi dizisinden belirli bir dizine (ürün fiyatının depolandığı) sahip bir öğe alacağız, onu sayısal forma dönüştüreceğiz ve siparişin toplam maliyetini hesaplayacağız. Tüm bu hesaplamaları yapacak bir metod yazalım:
public class Main {
    public static void main(String[] args) {
        String orderInfo = "1,cucumbers,2.39;2,tomatoes,1.89;3,bacon,4.99";
        System.out.println(getTotalOrderAmount(orderInfo));
        // Output: 9.27
    }

    static double getTotalOrderAmount(String orderInfo) {
        double totalAmount = 0d;
        final String[] items = orderInfo.split(";");

        for (String item : items) {
            final String[] itemInfo = item.split(",");
            totalAmount += Double.parseDouble(itemInfo[2]);
        }

        return totalAmount;
    }
}
Bu yöntemin kendi başınıza nasıl çalıştığını çözüp çözemeyeceğinize bakın. Bu örneklerden yola çıkarak, elimizde string olarak biçimlendirilmiş bazı veriler olduğunda ve ondan daha spesifik bazı bilgiler çıkarmamız gerektiğinde split yönteminin kullanıldığını söyleyebiliriz .

Özet

String sınıfının split yöntemini inceledik . Özel bir sınırlayıcı yardımıyla bir diziyi bileşen parçalarına ayırmanız gerektiğinde tam da ihtiyacınız olan şey budur. Yöntem, bir dizi dizi (orijinal diziyi oluşturan alt diziler) döndürür. Eşleşmeleri sınırlayıcı karakter(ler)i temsil eden bir normal ifadeyi kabul eder. Bu yöntemin çeşitli inceliklerini inceledik:
  • önde gelen bir sınırlayıcı;
  • iki parametreli aşırı yüklenmiş kardeşi.
Ayrıca, varsayımsal ancak oldukça gerçekçi sorunları çözmek için bölme yöntemini kullandığımız bazı gerçek yaşam durumlarını modellemeye çalıştık .
Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok