2015-12-16 6 views
10

मैं एक सूची में एक स्ट्रिंग के अक्षरों को जोड़ना चाहता हूं, लेकिन मैं केवल एक बार प्रत्येक अक्षर जोड़ना चाहता हूं। उदाहरण के लिए, यदि स्ट्रिंग "हेल्लो एएम क्रिसमस व्हाइट" है, तो कुछ पत्र एक से अधिक बार दिखाई दे रहे हैं, इसलिए मैं उन्हें केवल एक बार जोड़ना चाहता हूं।किसी सूची में दिए गए स्ट्रिंग के अद्वितीय अक्षर

मैं छोरों के लिए दो के बारे में सोच रहा हूँ:

for (int i=0; i< str.length(); i++){ 
    for(int j=0; j< str.length(); j++){ 
     if (str.charAt(i) != str.charAt(j)) { 
      myList.add(charAt(i)); 
     } 
    } 
} 

लेकिन इस कोड डुप्लिकेट से बचने नहीं करता।

+0

दो लूप क्यों? एक एकल originalLine.toCharArray() पर फिर से शुरू करें; यदि (! listContains (Char.valueOf (char [i])) addChar(); – Stultuske

+3

वैकल्पिक रूप से, आप इसकी सामग्री की विशिष्टता प्राप्त करने के लिए 'सेट' का उपयोग कर सकते हैं। –

उत्तर

14

यह अधिक विशिष्ट लक्षणों का निर्धारण करने के लिए एक LinkedHashSet उपयोग करने के लिए कुशल होगा। यदि आप LinkedHashSet का उपयोग करते हैं, तो इनपुट स्ट्रिंग के अद्वितीय वर्णों का क्रम संरक्षित किया जाएगा।

एकल लूप के बाद, कि रैखिक समय लगेगा, आप अपने उत्पादन List करने के लिए सभी विशेष अक्षर जोड़ सकते हैं।

Set<Character> unique = new LinkedHashSet<>(); 
for (int i = 0; i < str.length(); i++){ 
    unique.add(str.charAt(i)); 
} 
myList.addAll(unique); 
12

संग्रह में डुप्लिकेट को रोकने के लिए, आपको List की आवश्यकता नहीं है, आपको Set (जैसे HashSet) की आवश्यकता है।

यदि आप ऑर्डर को सुरक्षित रखना चाहते हैं तो आप अपना String एस जोड़ रहे हैं, LinkedHashSet का उपयोग करें।

अंत में, यदि आप अपने Set स्वाभाविक रूप से अपने String रों सॉर्ट करने के लिए (या उन्हें एक Comparator साथ सॉर्ट करने के लिए सक्षम होने के लिए) चाहते हैं, एक TreeSet का उपयोग करें।

उदाहरण

String foo = "ghghababcdef"; 
Set<String> hash = new HashSet<>(); 
Set<String> linked = new LinkedHashSet<>(); 
Set<String> tree = new TreeSet<>(); 
// iterating characters 
for (char c: foo.toCharArray()) { 
    // adding String representation of character to each set 
    hash.add(Character.toString(c)); 
    linked.add(Character.toString(c)); 
    tree.add(Character.toString(c)); 
} 
// printing... 
System.out.println(hash); 
System.out.println(linked); 
System.out.println(tree); 

आउटपुट

[a, b, c, d, e, f, g, h] // this may vary 
[g, h, a, b, c, d, e, f] // keeps insertion order 
[a, b, c, d, e, f, g, h] // sorted lexicographically by default 
4
Set जवाब अगर आप List समाधान के लिए छड़ी करना चाहते हैं के लिए एक विकल्प के रूप में

। आपको केवल एक बार लूप की आवश्यकता है और List.contains(Object) विधि का उपयोग करना है और जांचें कि वर्तमान char आपके List में पहले से मौजूद है या नहीं।

String str = "HELLO AM CHRISTOS WHITE"; 
List<Character> myList = new ArrayList<>(); 
for(int i=0; i< str.length(); i++){ 
    if (!myList.contains(str.charAt(i))) { 
     myList.add(str.charAt(i)); 
    } 
} 
for(char c : myList) { 
    System.out.println(c); 
} 

उत्पादन

मेरा अनुरोध स्वीकार AMCRISTW

0

j निर्दिष्ट नहीं की गई। मुझे लगता है कि इसे 0 से शुरू किया गया है इसलिए कोई अपवाद नहीं है

यदि आप for(int j=0; j< str.length(); j++) पर दूसरा लूप बदलते हैं तो यह अभी भी काम नहीं करेगा, यह स्ट्रिंग में डुप्लिकेट किए गए किसी भी अक्षर को मुद्रित नहीं करेगा।

तो इस बारे में सोचें कि किस श्रेणी को पुनरावृत्त करने की आवश्यकता है। यदि आप मेरी जिस्ट प्राप्त करते हैं, तो आप स्ट्रिंग में पहले से मौजूद किसी भी पत्र को मुद्रित नहीं करना चाहते हैं।

+0

यह मेरे कार्यक्रम में केवल एक उदाहरण सही था। प्रश्न वैसे भी अजीब था। –

+0

@ क्रिस्टोस माइकल: उस मामले में यह एक अच्छा विचार होगा, जो आपके प्रश्न का सबसे अच्छा जवाब देने के लिए एक अच्छा विचार होगा। इससे भविष्य के आगंतुकों को उनकी समस्या के लिए एक समाधान समाधान की पहचान करने में मदद मिलती है। देखें [जब कोई उत्तर देता है तो मुझे क्या करना चाहिए मेरा सवाल?] (http://stackoverflow.com/help/someone-answers) – IInspectable

+0

मेरा उत्तर आपके द्वारा प्रदान किए गए कोड में त्रुटि को संबोधित कर रहा था, मैं कैसे जान सकता हूं कि आपके प्रोग्राम में आपके पास क्या है। इसके अलावा, मैंने आपको संभाला लागू तर्क में समस्या का समाधान करना चाहता था, यह नहीं पता था कि आपके पास अच्छी तरह से ज्ञात डेटा संरचनाओं का उपयोग करने के लिए अन्य विकल्प हैं। –

0

दुर्भाग्य से जावा 8 में कोई चरित्र धारा है, लेकिन यहाँ एक जावा 8 तरीका है:

str.chars().distinct().mapToObj(c -> (char) c).collect(Collectors.toList()); 

यह कम कुशल हो सकता है लेकिन यह एक पठनीय एक लाइनर है और यह धाराओं की शक्ति को दर्शाता है।

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