2010-04-02 7 views
8

उदा।जावा में संख्यात्मक स्थिति के लिए चरित्र कैसे मानचित्र करें?

  • इनपुट: [ 'ए', 'Z', 'एफ', 'डी', ...]
  • उत्पादन: [0, 25, 5, 3, ...]

सी में मैं सिर्फ 'ए' से चार को घटा दूंगा, लेकिन ऐसा लगता है कि मैं जावा में ऐसा करने में सक्षम नहीं हूं।

उत्तर

13

साथ ही आप जावा में वर्ण के साथ सरल गणित कर सकते हैं:

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

इच्छा उत्पादन 0.

+3

ध्यान दें कि उनको वर्ण होना चाहिए, न कि स्ट्रिंग्स।एकल उद्धरण महत्वपूर्ण हैं। – Thilo

+0

यह डोमेन के बाहर के पात्रों के लिए फर्जी मान लौटाएगा। कोड नाजुक है। –

+1

"यह डोमेन के बाहर के पात्रों के लिए फर्जी मान लौटाएगा।" तो सी समकक्ष होगा। – Thilo

20

उपयोग स्ट्रिंग ऑब्जेक्ट पर indexOf विधि। उदाहरण के लिए,

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')

रिटर्न 5.

+2

अरे, अच्छी चाल :) –

+3

यदि आपको रेंज चेक की आवश्यकता नहीं है, तो 'एफ' - 'ए' तेज है, हालांकि। – Thilo

+0

त्रुटि मामलों के लिए खाता न भूलें - अगर इंडेक्सऑफ रिटर्न -1, इसका मतलब है कि इसे स्ट्रिंग में नहीं एक वर्ण दिया गया था (इस मामले में, ऊपरी-केस अक्षर के अलावा कुछ)। – Etaoin

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

@ स्टेफन वापस करने की आवश्यकता है, यह एक भयानक समाधान है, क्योंकि आप वर्णमाला के माध्यम से रैखिक रूप से खोज रहे हैं। निश्चित रूप से, यह स्थिर समय है क्योंकि आपके पास निश्चित आकार का वर्णमाला है, लेकिन यह अनावश्यक रूप से धीमा है। –

+4

इसके अलावा, -1 अन्य सभी को कम करने के लिए। यह सिर्फ अप्रिय है। –

+0

फिर चरित्र के मानचित्र का उपयोग संख्या मूल्य पर करें। इस समाधान के लिए 26 वर्ण तुलना (औसतन 13) की आवश्यकता होती है, जो कि हैशकोड के लिए एक कॉल बनाम है, इसलिए गति के मामले में सबसे अच्छी बचत होती है। –

2

उत्पादन आप उम्मीद कर रहे हैं बस 'A' के संबंध में एक अपर केस अक्षर का offset है। तो बस उस पत्र के यूनिकोड मान से 'A' के यूनिकोड मान को घटाएं जिसका ऑफ़सेट आवश्यक है।

उदाहरण: 'B' - 'A' = 1

+0

उपरोक्त मेरी टिप्पणियां पढ़ें। यह कोड स्वाभाविक रूप से गलत है। –

+0

@Stefan: मैं उपरोक्त केवल अपरकेस अक्षरों के लिए आवेदन करूंगा। किसी भी चार के लिए नहीं। – codaddict

+3

"स्वाभाविक रूप से गलत" थोड़ा मजबूत है। यह इनपुट को उचित सीमा से मानता है, लेकिन इसमें कुछ भी गलत नहीं है। – Thilo

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

} 
4

वास्तव में अन्य समाधान यहाँ के कमजोर बिंदु है कि वे स्ट्रिंग निर्माण

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() कॉल फिसल में वहाँ भी आप समारोह

के लिए कॉल को नियंत्रित नहीं कर रहे हैं यदि आप और अधिक गतिशील रूप से आपकी वर्णमाला बनाने के बजाय एक पूर्वनिर्धारित वर्णमाला का उपयोग करने के लिए देख रहे हैं के बारे में सोचना चाहते हो सकता है, आपको नक्शे में देखना चाहिए

संबंधित मुद्दे