उदा।जावा में संख्यात्मक स्थिति के लिए चरित्र कैसे मानचित्र करें?
- इनपुट: [ 'ए', 'Z', 'एफ', 'डी', ...]
- उत्पादन: [0, 25, 5, 3, ...]
सी में मैं सिर्फ 'ए' से चार को घटा दूंगा, लेकिन ऐसा लगता है कि मैं जावा में ऐसा करने में सक्षम नहीं हूं।
उदा।जावा में संख्यात्मक स्थिति के लिए चरित्र कैसे मानचित्र करें?
सी में मैं सिर्फ 'ए' से चार को घटा दूंगा, लेकिन ऐसा लगता है कि मैं जावा में ऐसा करने में सक्षम नहीं हूं।
साथ ही आप जावा में वर्ण के साथ सरल गणित कर सकते हैं:
System.out.println('A' - 'A');
इच्छा उत्पादन 0.
उपयोग स्ट्रिंग ऑब्जेक्ट पर indexOf
विधि। उदाहरण के लिए,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')
रिटर्न 5.
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return alphabet.indexOf(myChar);
@ स्टेफन वापस करने की आवश्यकता है, यह एक भयानक समाधान है, क्योंकि आप वर्णमाला के माध्यम से रैखिक रूप से खोज रहे हैं। निश्चित रूप से, यह स्थिर समय है क्योंकि आपके पास निश्चित आकार का वर्णमाला है, लेकिन यह अनावश्यक रूप से धीमा है। –
इसके अलावा, -1 अन्य सभी को कम करने के लिए। यह सिर्फ अप्रिय है। –
फिर चरित्र के मानचित्र का उपयोग संख्या मूल्य पर करें। इस समाधान के लिए 26 वर्ण तुलना (औसतन 13) की आवश्यकता होती है, जो कि हैशकोड के लिए एक कॉल बनाम है, इसलिए गति के मामले में सबसे अच्छी बचत होती है। –
उत्पादन आप उम्मीद कर रहे हैं बस 'A'
के संबंध में एक अपर केस अक्षर का offset
है। तो बस उस पत्र के यूनिकोड मान से 'A'
के यूनिकोड मान को घटाएं जिसका ऑफ़सेट आवश्यक है।
उदाहरण: 'B' - 'A' = 1
यहां विभिन्न कार्यान्वयन जो लघुगणक समय में चलाता है:
कक्षा
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));
}
}
यूनिट टेस्ट
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'));
}
}
वास्तव में अन्य समाधान यहाँ के कमजोर बिंदु है कि वे स्ट्रिंग निर्माण
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
}
शामिल आप अब प्राप्त करने के लिए यहाँ में ऑफसेट क्रमसूचक समारोह का उपयोग कर सकते है। जैसे Alphabet.L.ordinal();
हालांकि, बाद से मुझे लगता है कि आप कार्यों के साथ काम कर रहे हैं, यहाँ एक और अधिक उपयोगी परिभाषा है
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();
}
}
नोट्स: अन्य भाषाओं के विपरीत, आप वास्तव में एक वर्ग की तरह उसकी अपनी फ़ाइल में एक enum घोषणा कर सकते हैं। वास्तव में ऊपर दिखाए गए अनुसार enums में फ़ील्ड और विधियां भी हो सकती हैं, फ़ील्ड स्थिर रूप से बनाए जाते हैं, और तोड़ने में बहुत मुश्किल होती है। असल में केवल स्थानीय तरीकों और चर के साथ एक enum का उपयोग और एक सिंगल एनम प्रकार जिसे इंस्टेंस कहा जाता है, एक सिंगलटन बनाने का अनुशंसित तरीका है क्योंकि यह प्रतिबिंब द्वारा भी अटूट है।
आप एक toUppercase() कॉल फिसल में वहाँ भी आप समारोह
के लिए कॉल को नियंत्रित नहीं कर रहे हैं यदि आप और अधिक गतिशील रूप से आपकी वर्णमाला बनाने के बजाय एक पूर्वनिर्धारित वर्णमाला का उपयोग करने के लिए देख रहे हैं के बारे में सोचना चाहते हो सकता है, आपको नक्शे में देखना चाहिए
ध्यान दें कि उनको वर्ण होना चाहिए, न कि स्ट्रिंग्स।एकल उद्धरण महत्वपूर्ण हैं। – Thilo
यह डोमेन के बाहर के पात्रों के लिए फर्जी मान लौटाएगा। कोड नाजुक है। –
"यह डोमेन के बाहर के पात्रों के लिए फर्जी मान लौटाएगा।" तो सी समकक्ष होगा। – Thilo