2010-04-02 32 views

Trả lời

13

Bạn có thể làm toán đơn giản với ký tự trong Java cũng như:

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

chí đầu ra 0.

+3

Lưu ý rằng những thứ đó phải là ký tự chứ không phải là Chuỗi.Các dấu nháy đơn là quan trọng. – Thilo

+0

Điều này sẽ trả về giá trị không có thật cho các ký tự bên ngoài miền. Mã là mong manh. –

+1

"Điều này sẽ trả về giá trị không có thật cho các ký tự bên ngoài miền.". Vì vậy, sẽ tương đương với C. – Thilo

20

Sử dụng indexOf phương thức trên một đối tượng String. Ví dụ,

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')

lợi nhuận 5.

+2

Hey, lừa đẹp :) –

+3

Nếu bạn không yêu cầu kiểm tra phạm vi, 'F' - 'A' là nhanh hơn, mặc dù. – Thilo

+0

Đừng quên tính đến các trường hợp lỗi - nếu indexOf trả về -1, điều đó có nghĩa là nó được đưa ra một ký tự không có trong chuỗi (trong trường hợp này, một cái gì đó ngoài một chữ cái viết hoa). – Etaoin

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

@Stefan, đó là một giải pháp khủng khiếp, vì bạn đang tìm kiếm tuyến tính thông qua bảng chữ cái. Chắc chắn, đó là thời gian liên tục bởi vì bạn có một bảng chữ cái kích thước cố định, nhưng nó là không cần thiết chậm. –

+4

Ngoài ra, -1 cho downvoting tất cả mọi người khác. Điều đó thật đáng ghét. –

+0

Sau đó sử dụng bản đồ ký tự cho giá trị số. Giải pháp này yêu cầu so sánh 26 ký tự (trung bình 13), so với lời gọi hàm băm, do đó, tiết kiệm nhỏ nhất ở tốc độ cao nhất. –

2

Sản lượng bạn đang mong đợi chỉ là offset một bức thư chữ hoa đối với 'A' với. Vì vậy, chỉ cần trừ giá trị Unicode của 'A' từ giá trị unicode của chữ cái cần bù.

dụ: 'B' - 'A' = 1

+0

Đọc nhận xét của tôi ở trên. Mã này vốn đã sai. –

+0

@Stefan: Tôi sẽ chỉ áp dụng ở trên cho chữ hoa. Không phải cho bất kỳ char. – codaddict

+3

"Rất sai" là một chút mạnh mẽ. Nó giả định đầu vào là từ phạm vi thích hợp, nhưng không có gì sai với điều đó. – Thilo

1

Dưới đây là thực hiện khác nhau mà chạy trong thời gian logarit:

Lớp

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));     
    } 
} 

Unit 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

thực sự là điểm yếu trong những giải pháp khác ở đây là họ liên quan đến chuỗi tạo

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 
} 

bây giờ bạn có thể sử dụng chức năng thứ để có được bù đắp ở đây. ví dụ. Alphabet.L.ordinal();

Tuy nhiên, kể từ khi tôi giả sử bạn đang đối phó với các chức năng, đây là một định nghĩa hữu ích hơ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; 

    public static int getNum(String targ) { 
     return valueOf(targ).ordinal(); 
    } 

    public static int getNum(char targ) { 
     return valueOf(String.valueOf(targ)).ordinal(); 
    }  
} 

Ghi chú: không giống như các ngôn ngữ khác, bạn có thể khai báo một enum trong tập tin riêng của nó giống hệt như một lớp. Trên thực tế enums như được hiển thị ở trên có thể chứa các lĩnh vực và phương pháp quá, các lĩnh vực được tạo ra tĩnh, và rất khó để phá vỡ. Trong thực tế, việc sử dụng một enum chỉ với các phương thức cục bộ và các biến và một kiểu enum duy nhất được gọi là INSTANCE là cách được khuyến nghị để tạo ra một singleton vì nó không thể phá vỡ ngay cả khi được phản chiếu.

Bạn có thể muốn suy nghĩ về trượt a) gọi (toUppercase trong đó quá nếu bạn không kiểm soát các cuộc gọi đến chức năng

Nếu bạn đang tìm kiếm để năng động hơn tạo ra bảng chữ cái của bạn hơn là sử dụng một bảng chữ cái được xác định trước, bạn nên xem xét bản đồ

Các vấn đề liên quan