2015-06-07 32 views
16

Herhangi bir unicode karakteri içerebilecek bir değişken dizilim var. Bu unicode karakterlerden biri han 'dur.Uzunluğu> 1 olan karakterleri hesaplarken bir String'in her karakterini nasıl karşılaştırırım?

şey bu "han" karakteri "".length() == 2 var ama tek karakter olarak dize ile yazılmış olmasıdır. Aşağıdaki kodu düşünüldüğünde

, nasıl tüm karakterleri üzerinde yineleme ve aslında o 1'den büyük uzunlukta bir karakter içerebilir göz önünde her biri karşılaştırmak istiyorsunuz?

for (int i = 0; i < string.length(); i++) { 
    char character = string.charAt(i); 
    if (character == '') { 
     // Fail, it interprets as 2 chars =/ 
    } 
} 

DÜZENLEME:
Bu soru bir kopyası olmaması gerekir. Bu, .length() > 1 karakterlerini (karakter char türünde değil, yazılı bir sembolün temsili olarak) göz önünde bulundurarak bir String'in her karakteri için yinelemeyi nasıl sorar. Bu soru, bir Java String'in unicode kod noktaları üzerinden nasıl yineleneceğine dair önceki bilgileri gerektirmez;

+5

http://stackoverflow.com/questions/1527856/how-can-i-iterate-through-the-unicode-codepoints-of-a-java-string – user2357112

+0

"Karakter" yerine "sembol" kullanmalı mıyım? Bu soru netleştirmek için? –

cevap

11
int hanCodePoint = "".codePointAt(0); 
for (int i = 0; i < string.length();) { 
    int currentCodePoint = string.codePointAt(i); 
    if (currentCodePoint == hanCodePoint) { 
     // do something here. 
    } 
    i += Character.charCount(currentCodePoint); 
} 
+0

Tek tırnak ile karşılaştırmak için bir yol yok '' ''? –

+2

maalesef, hayır. 'geçerli bir Unicode karakteridir, ancak tek bir Java 'char' olarak ifade edilemez, bu da tek tırnak içine koymanız gereken şeydir. Eğer denersen, bunu derleyemeyeceğini farkedeceksin. Bir java 'char' sadece Unicode karakterlerini kod noktası 65,535'e kadar temsil edebilir. Geçmişte, karakteri göstermek için 2 vekil 'char's'a ihtiyacınız var ya da sadece bir' String' kullanın. Çok sinir bozucu, katılıyorum. – sstan

+0

Gerçekten, derleyemiyorum. Teşekkürler dostum! –

-4

bir ASCII karakter Unicode karakter yapar yarım miktar alır, bu yüzden han karakter uzunluğu 2. değil bir ASCII Char, ne Unicode mektubun olduğunu mantıklı. İkinci durum buysa, harf doğru olarak gösterilecektir.

+0

Unicode'daki bir ASCII karakteri, ASCII ile aynı boyuttadır. Daha çok atıfta bulunduğunuz, çok baytlı Unicode karakterleridir. – Makoto

+0

Üzgünüm, haklısın – user9138

9

String.charAt ve String.length yöntem UTF-16 kod birimi bir dizi olarak bir String muamele. Dizeyi Unicode kod noktaları olarak kullanmak istersiniz.

Yaylı API "kod noktası" yöntemlerini

Görünüş:

  • codePointAt(int index) döner, belirli bir kod birimi endeksi
  • offsetByCodePoints(int index, int codePointOffset) de (32 bit) kod noktası karşılık gelen kod birimi dizini döndürür index kod biriminden codePointOffset kod noktalarına.
  • codePointCount(int beginIndex, int endIndex)
  • iki kod birimi endeksler arasındaki kod noktalarını sayar.

Dizgiyi kod noktası dizinine göre dizinlemek, özellikle dizgi uzunsa ve verimli bir şekilde yapmak istiyorsanız biraz zor olur. Ancak, bu kod, oldukça hantal olsa da yapılabilir.

@sstan'ın cevabı tek çözümdür.

3

sen dize ve String olarak s aradığınız verileri hem tedavi, bu basit olacaktır.

if (string.contains("") { 
    // do something here. 
} 

Özellikle o karakterin bulunduğu indisi gerekirse: sadece o karakterin varlığını test etmek gerekirse gerçekten her kod noktasından yineleme gerekiyorsa

int i = string.indexOf(""); 
if (i >= 0) { 
    // do something with i here. 
} 

Ve How can I iterate through the unicode codepoints of a Java String?.

+0

Test ettiğim tüm karakterler için '.contains' veya' .indexOf' kullanarak zamanın maliyeti nedir? '.contains' veya' .indexOf' yerine sadece uzunluk> 1'li karakterler kullanmak yerine daha genel bir yaklaşım arıyorum. –

+0

Bu yanıt, bazı performanstan ödün vermekle birlikte, unicode kod noktaları üzerinde yinelemekten ziyade bu soruya daha yakın görünüyor. –