2010-04-02 14 views

cevap

13

Siz de Java karakter ile basit matematik yapabilirsiniz:

System.out.println('A' - 'A'); 

irade çıkışı 0.

+3

Haritalarına bakmanız gerekir. Bunların karakter olması gerektiğini unutmayın, Strings değil.Tek tırnaklar önemlidir. – Thilo

+0

Bu, etki alanı dışındaki karakterler için sahte değerler döndürecektir. Kod kırılgandır. –

+1

"Bu, alanın dışındaki karakterler için sahte değerler döndürecektir." Yani C eşdeğeri olacak. – Thilo

20

kullanın String nesne üzerinde indexOf yöntemi. Örneğin,

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')

döner 5.

+2

Hey, güzel numaralar :) –

+3

Aralık kontrollerine ihtiyacınız yoksa, 'F' - 'A' daha hızlıdır. – Thilo

+0

hata durumlarından sorumlu unutmayın - indexOf -1 dönerse, işte bu (bir harf harfi yanında bu durumda, bir şey) bir değil dizesinde karakter verildi demektir. – Etaoin

-1
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
return alphabet.indexOf(myChar); 
+2

@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. –

+4

Ayrıca, -1 herkesi aşağı çekmek için. Bu sadece iğrenç. –

+0

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. –

2

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

+0

Yukarıdaki yorumları okuyun. Bu kod doğal olarak yanlıştır. –

+0

@Stefan: Yukarıdakileri yalnızca büyük harfler için uygularım. Herhangi bir char için değil. – codaddict

+3

"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

1

İş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')); 
    } 

} 
4
Burada diğer çözümlerin

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,

İlgili konular