Codegym Üniversitesi kursunun bir parçası olarak bir akıl hocası ile bir ders parçası. Tüm kurs için kaydolun.


"Merhaba Amigo! Bugün dizilerle çalışmayı içeren birkaç yaygın senaryoyu daha analiz edeceğiz. Örneğin, bir diziyi birkaç parçaya nasıl ayıracağınızı biliyor musunuz?"

"Sana hemen söylemeyeceğim Ellie. Ama sen bana söyleyeceksin, değil mi?"

split()yöntem

"Bunu yapmanın birkaç yolu var. Bir diziyi birden çok parçaya ayırmanın ilk yolu, yöntemi kullanmaktır split(). Özel bir sınırlayıcı dize tanımlayan bir düzenli ifade, parametre olarak iletilmelidir. Normal ifadenin ne olduğunu öğreneceksiniz. Java Koleksiyonları arayışı.

Örnek:

kod Sonuç
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Sonuç, üç dizeden oluşan bir dizi olacaktır:
["Good ", "ws everyo", "!"]

Basit, ancak bazen bu yaklaşım aşırıdır. Çok sayıda sınırlayıcı varsa (örneğin, boşluklar, yeni satır karakterleri, sekmeler, noktalar), o zaman oldukça karmaşık bir düzenli ifade oluşturmanız gerekir."

"Eh, tabii. Ve eğer okumak zorsa, değişiklik yapmak da zordur.

StringTokenizersınıf

Codegym Üniversitesi kursunun bir parçası olarak bir akıl hocası ile bir ders parçası. Tüm kurs için kaydolun.


"Java'nın tüm işi bir diziyi alt dizilere bölmek olan özel bir sınıfı var.

"Bu sınıf normal ifadeler kullanmaz: bunun yerine, yalnızca sınırlayıcılardan oluşan bir dize iletirsiniz. Bu yaklaşımın avantajı, tüm dizeyi bir kerede parçalara ayırmaması, bunun yerine baştan sona hareket etmesidir. Her seferinde adım atmak.

Sınıfın bir yapıcısı ve iki yöntemi vardır. Kurucuya, parçalara ayırdığımız bir diziyi ve sınırlayıcı karakterlerden oluşan bir diziyi iletiyoruz.

Yöntemler Tanım
String nextToken()
Bir sonraki alt dizeyi döndürür
boolean hasMoreTokens()
Daha fazla alt dizi olup olmadığını kontrol eder.

nextLine()"Bu sınıf bir şekilde bana ve yöntemleri de olan Scanner sınıfını hatırlatıyor hashNextLine().

"Yaptığın iyi gözlem. StringTokenizerŞu komutla bir nesne yaratabilirsin:

StringTokenizer name = new StringTokenizer(string, delimiters);

Dize, parçalara bölünecek dizedir. Ayırıcılar bir dizedir ve içindeki her karakter bir sınırlayıcı olarak değerlendirilir. Örnek:

kod Konsol çıkışı
String str = "Good news everyone!";

StringTokenizer tokenizer = new StringTokenizer(str,"ne");
while (tokenizer.hasMoreTokens())
{
   String token = tokenizer.nextToken();
   System.out.println(token);
}
Good 
ws 
v
ryo
!

"İkinci dizede yapıcıya iletilen dizedeki her karakterin StringTokenizerbir ayırıcı olarak kabul edildiğini unutmayın.

String.format()yöntem ve StringFormattersınıf

"String sınıfının bir başka ilginç yöntemi de format().

"Diyelim ki veri depolayan çeşitli değişkenleriniz var. Bunları ekranda tek satırda nasıl görüntülersiniz? Örneğin, bazı verilerimiz (sol sütun) ve istenen çıktımız (sağ sütun):

kod Konsol çıkışı
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Böyle bir programın kodu şöyle görünecektir:

Program kodu
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + name + ", age:" + age + " years, friend: " + friend+", weight: " + weight + " kg.}");

"Kodun pek okunabilir olmadığı konusunda benimle aynı fikirde olacaksınız. Ve değişken adları daha uzun olsaydı, o zaman kod daha da zorlaşırdı:

Program kodu
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

"Evet, zor bir okuma!"

"Endişelenme. Bu, gerçek dünya programlarında sık görülen bir durumdur, bu yüzden size bu kodu daha basit ve daha özlü yazmanın bir yolunu anlatmak istiyorum.

String.format

" StringSınıfın statik bir format()yöntemi vardır: bir diziyi verilerle birleştirmek için bir kalıp belirlemenizi sağlar. Komutun genel görünümü aşağıdaki gibidir:

String name = String.format(pattern, parameters);

Örnek:

kod Sonuç
String.format("Age=%d, Name=%s", age, name);
Age=12, Name=Amigo
String.format("Width=%d, Height=%d", width, height);
Width=20, Height=10
String.format("Fullname=%s", name);
Fullname=Diego

" Metodun ilk parametresi, istenen tüm metni ve veri eklemeniz gereken yerlerde biçim belirticileri ( ve format()gibi) adı verilen özel karakterleri içeren bir biçim dizesidir .%d%s

" Yöntem, bunları ve biçim belirticilerini, parametre listesindeki biçim dizesini izleyen parametrelerle format()değiştirir . Bir dize eklemek istiyorsak, o zaman yazarız . Bir sayı eklemek istiyorsak, o zaman biçim belirticidir . Örnek:%s%d%s%d

kod Sonuç
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
seşittir"a=1, b=4, c=3"

"Biçim dizesi içinde kullanılabilecek kısa bir biçim belirtici listesi:

belirleyici Anlam
%s
String
%d
tamsayı: byte, short, int,long
%f
gerçek sayı: float,double
%b
boolean
%c
char
%t
Date
%%
%karakter

"Bu belirticiler veri tipini belirtir, ancak verilerin sırasını belirten belirticiler de vardır. Numarasına göre bir argüman elde etmek için (numaralandırma birden başlar), " yerine " % 1$ d " yazmanız gerekir . %d ". Örnek:

kod Sonuç
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
seşittir"a=13, b=12, c=11"

%3$d3. bağımsız değişkeni alır, %2$dikinci bağımsız değişkeni alır ve %dilk bağımsız değişkeni alır. %sve biçim belirticileri , veya %dgibi belirticilerden bağımsız olarak bağımsız değişkenlere atıfta bulunur.%3$d%2$s

Dize Havuzu

StringPool"Kodda bir dizgi değişmezi olarak belirtilen her dizgi , program çalışırken adı verilen bir bellek alanında saklanır . StringPoolDizgileri depolamak için özel bir dizidir. Amacı, dizge depolamayı optimize etmektir:

"Öncelikle, kodda belirtilen dizilerin bir yerde saklanması gerekir, değil mi? Kod komutlardan oluşur, ancak veriler (özellikle büyük diziler) koddan ayrı olarak bellekte saklanmalıdır. Kodda yalnızca dize nesnelerine yapılan başvurular görünür.

StringPool"İkincisi, tüm özdeş dize sabit değerleri bellekte yalnızca bir kez saklanmalıdır. Ve bu şekilde çalışır. Sınıf kodunuz Java makinesi tarafından yüklendiğinde, tüm dize değişmez değerleri , eğer zaten orada değilse, e-postaya eklenir. zaten oradaysa, o zaman basitçe StringPool.

Buna göre, kodunuzdaki birkaç String değişkenine aynı sabit değeri atarsanız, bu değişkenler aynı referansı içerecektir. Yalnızca bir kez bir hazır bilgi eklenecektir StringPool. Diğer tüm durumlarda, kod zaten StringPool.

İşte kabaca nasıl çalıştığı:

kod StringPoll ile Çalışmak
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"İşte bu yüzden ave bdeğişkenleri aynı referansları saklayacak."

"Umarım her şeyi doğru anlamışımdır.

intern()yöntem.

"Ve en iyi yanı, programlı olarak herhangi bir dizeyi ekleyebilirsiniz . Bunu yapmak için, değişkenin yöntemini StringPoolçağırmanız yeterlidir .Stringintern()

" Yöntem , zaten orada değilse dizeyi ekleyecek intern()ve .StringPoolStringPool

StringPool"Ve yöntemi kullanarak iki özdeş dizi eklenirse ne olur intern()?"

"Yöntem aynı referansları döndürür. Bu, dizeleri referansa göre karşılaştırmak için kullanılabilir. Örnek:

kod Not
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);


false
String a = new String("Hello");
String b = new String("Hello");

String t1 = a.intern();
String t2 = b.intern();
System.out.println(a == b);
System.out.println(t1 == t2);





false
true

Bu yöntemi sık sık kullanmanız pek olası değildir. Bununla birlikte, insanlar iş görüşmelerinde bunu sormayı sever.

"Öyleyse, bilmemektense bilmek daha iyidir. Teşekkürler Ellie!"