Ví dụ:Làm cách nào để ánh xạ ký tự đến vị trí số trong java?
- đầu vào: [ 'A', 'Z', 'F', 'D', ...]
- đầu ra: [0, 25, 5, 3, ...]
Trong C tôi chỉ cần trừ char từ 'A', nhưng tôi dường như không thể làm điều này trong java.
Ví dụ:Làm cách nào để ánh xạ ký tự đến vị trí số trong java?
Trong C tôi chỉ cần trừ char từ 'A', nhưng tôi dường như không thể làm điều này trong java.
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.
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.
Hey, lừa đẹp :) –
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
Đừ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
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return alphabet.indexOf(myChar);
@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. –
Ngoài ra, -1 cho downvoting tất cả mọi người khác. Điều đó thật đáng ghét. –
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. –
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
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'));
}
}
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 đồ
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
Đ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. –
"Đ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