E.g.Karakter, java'daki sayısal konuma nasıl eşlenir?
- girişi: [ 'A', 'Z' 'K', 'd', ...]
- çıkışı: [0, 25, 5, 3, ...]
C Sadece char 'A' dan çıkarırdım, ama bunu java'da yapamıyorum.
E.g.Karakter, java'daki sayısal konuma nasıl eşlenir?
C Sadece char 'A' dan çıkarırdım, ama bunu java'da yapamıyorum.
Siz de Java karakter ile basit matematik yapabilirsiniz:
System.out.println('A' - 'A');
irade çıkışı 0.
kullanın String nesne üzerinde indexOf
yöntemi. Örneğin,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')
döner 5.
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return alphabet.indexOf(myChar);
@Stefan kadar korkunç bir çözümdür - Ben A-1 de-1, B-2 b dönmek gerekir. Elbette, sabit boyutlu bir alfabeye sahip olduğunuz için sabit bir zamandır, ancak gereksiz bir şekilde yavaştır. –
Ayrıca, -1 herkesi aşağı çekmek için. Bu sadece iğrenç. –
Ardından sayı değerine bir karakter haritası kullanın. Bu çözüm, hashcode'a yapılan bir çağrıya karşı 26 karakter karşılaştırması (ortalama 13) gerektirir, bu nedenle hız açısından en iyi düzeyde küçük tasarruflar vardır. –
sen bekliyoruz çıkış 'A'
göre bir büyük harf sadece offset
olduğunu. Dolayısıyla, 'A'
'un Unicode değerini, ofset gerekli olan unicode değerinden çıkarmanız yeterlidir.
örnek: 'B' - 'A' = 1
Yukarıdaki yorumları okuyun. Bu kod doğal olarak yanlıştır. –
@Stefan: Yukarıdakileri yalnızca büyük harfler için uygularım. Herhangi bir char için değil. – codaddict
"Doğal olarak yanlış" biraz güçlüdür. Girişin uygun aralıktan olduğunu varsayar, ancak bununla ilgili yanlış bir şey yoktur. – Thilo
İşte logaritmik sürede çalışır farklı uygulama var:
Sınıf
import java.util.Arrays;
import java.util.Collections;
public class CharacterIndex {
private char[] characters = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
public int index(char character) {
assert characters != null;
return Arrays.binarySearch(characters, Character.toUpperCase(character));
}
}
Birim Test
import org.junit.Before;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
public class CharacterIndexTest {
private CharacterIndex characterIndex;
@Before
public void createIndex() {
characterIndex = new CharacterIndex();
}
@Test
public void testIndexOfLetterA() {
assertEquals(0, characterIndex.index('A'));
assertEquals(0, characterIndex.index('a'));
}
@Test
public void testNotALetter() {
assertEquals(-1, characterIndex.index('1'));
}
}
aslında zayıf noktası Artik sadece buraya ofset almak için sıra işlevini kullanabilirsiniz dize oluşturulmasını
public enum Alphabet {
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
}
dahil olmasıdır. Örneğin. Alphabet.L.ordinal(); Ancak
, sana fonksiyonları ile ilgileniyor varsaydığımızdan, burada daha yararlı bir tanımıdır
public enum Alphabet {
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z;
public static int getNum(String targ) {
return valueOf(targ).ordinal();
}
public static int getNum(char targ) {
return valueOf(String.valueOf(targ)).ordinal();
}
}
Notlar: Diğer dillerde aksine, tam bir sınıf gibi kendi dosyasında bir enum bildirebilirsiniz. Aslında yukarıda gösterildiği gibi numaralar alanları ve yöntemleri de içerebilir, alanlar statik olarak oluşturulur ve kırılması çok zordur. Aslında enumun kullanımı sadece yerel metot ve değişkenler ve INSTANCE olarak adlandırılan tek bir enum tipi ile yansıma yoluyla bile kırılamayacak şekilde tek bir parça yaratmanın en iyi yoludur.
Sen daha dinamik alfabe oluşturmak yerine önceden tanımlanmış alfabeyi kullanmaya arıyorsanız çok işleve
çağrıları kontrol değilse orada bir toUpperCase() çağrısını kayma düşünmek isteyebilirsiniz,
Haritalarına bakmanız gerekir. Bunların karakter olması gerektiğini unutmayın, Strings değil.Tek tırnaklar önemlidir. – Thilo
Bu, etki alanı dışındaki karakterler için sahte değerler döndürecektir. Kod kırılgandır. –
"Bu, alanın dışındaki karakterler için sahte değerler döndürecektir." Yani C eşdeğeri olacak. – Thilo