2016-11-30 3 views
5

Ich schreibe ein Programm, das das eindeutige Zeichen in einer Zeichenfolge (über einen Scanner eingegeben) drucken wird. Ich habe eine Methode erstellt, die versucht, dies zu erreichen, aber ich bekomme immer wieder Zeichen, die nicht wiederholt werden, anstelle eines Zeichens (oder von Zeichen), das für die Zeichenkette einzigartig ist. Ich möchte nur die einzigartigen Buchstaben.Java: Drucken Sie ein eindeutiges Zeichen in einer Zeichenfolge

Hier ist mein Code:

import java.util.Scanner; 
public class Sameness{ 
    public static void main (String[]args){ 
    Scanner kb = new Scanner (System.in); 
    String word = ""; 

    System.out.println("Enter a word: "); 
    word = kb.nextLine(); 

    uniqueCharacters(word); 
} 

    public static void uniqueCharacters(String test){ 
     String temp = ""; 
     for (int i = 0; i < test.length(); i++){ 
      if (temp.indexOf(test.charAt(i)) == - 1){ 
       temp = temp + test.charAt(i); 
     } 
     } 

    System.out.println(temp + " "); 

    } 
}    

Und hier ist Beispielausgabe mit dem obigen Code:

Enter a word: 
nreena 
nrea 

Die erwartete Ausgabe wäre: ra

+0

Was ist die erwartete Ausgabe für ‚nreena‘? – developer

+1

Aber 'e' ist eine Wiederholung, und Sie bekommen es immer noch. Ist die gewünschte Ausgabe "ra"? – Gendarme

+0

Wie auch immer, ich würde etwas wie char [] array = test machen.toCharArray(); 'und dann durchlaufen Sie' array' für jeden Buchstaben in 'test' und wenn es keine Übereinstimmungen gibt, tun Sie' temp = temp + test.charAt (i); '. – Gendarme

Antwort

5

Basierend auf Ihren gewünschten Ausgang, Sie haben ein Zeichen ersetzen, das ursprünglich bereits hinzugefügt wurde, wenn es später dupliziert wird, also:

public static void uniqueCharacters(String test){ 
    String temp = ""; 
    for (int i = 0; i < test.length(); i++){ 
     char current = test.charAt(i); 
     if (temp.indexOf(current) < 0){ 
      temp = temp + current; 
     } else { 
      temp = temp.replace(String.valueOf(current), ""); 
     } 
    } 

    System.out.println(temp + " "); 

} 
+1

das ist * effizient *! – Xlee

+0

@Xlee, danke – lmiguelvargasf

+0

Vielen Dank! – Dextra

2

Obwohl, um eine Lösung zu nähern, würde ich vorschlagen, dass Sie versuchen, eine bessere Datenstruktur und nicht nur Zeichenfolge zu verwenden. Dennoch können Sie einfach ändern Sie Ihre Logik löschen bereits bestehende Duplikate eine else wie folgt verwendet:

public static void uniqueCharacters(String test) { 
     String temp = ""; 
     for (int i = 0; i < test.length(); i++) { 
      char ch = test.charAt(i); 
      if (temp.indexOf(ch) == -1) { 
       temp = temp + ch; 
      } else { 
       temp.replace(String.valueOf(ch),""); // added this to your existing code 
      } 
     } 

     System.out.println(temp + " "); 

    } 
+1

Es scheint komisch, aber meine Antwort und Ihre sehen fast genau gleich aus, aber nur der Name einer Variablen wird geändert. Obwohl ich diese Variable verwendet habe, wenn sie verwendet werden könnte, d. H. Ich habe test.charAt (i) nicht mehr als einmal wiederholt. – lmiguelvargasf

+0

Korrekt sollte seine Verwendung nicht wiederholt haben. wollte nur den OP-Code optimieren. verpasst das. – nullpointer

0

Ich würde speichern alle Zeichen des Strings in einem Array, die Sie durch die Schleife zu überprüfen, ob die aktuellen Zeichen erscheint dort mehr als einmal. Wenn dies nicht der Fall ist, fügen Sie es zu temp hinzu.

public static void uniqueCharacters(String test) { 
    String temp = ""; 
    char[] array = test.toCharArray(); 
    int count; //keep track of how many times the character exists in the string 

    outerloop: for (int i = 0; i < test.length(); i++) { 
     count = 0; //reset the count for every new letter 
     for(int j = 0; j < array.length; j++) { 
      if(test.charAt(i) == array[j]) 
       count++; 
      if(count == 2){ 
       count = 0; 
       continue outerloop; //move on to the next letter in the string; this will skip the next two lines below 
      } 
     } 
     temp += test.charAt(i); 
     System.out.println("Adding."); 
    }  
    System.out.println(temp); 
} 

Ich habe Kommentare für einige weitere Details hinzugefügt.

0

Wie wäre das KISS-Prinzip Anwendung:

public static void uniqueCharacters(String test) { 
    System.out.println(test.chars().distinct().mapToObj(c -> String.valueOf((char)c)).collect(Collectors.joining())); 
} 
+0

Hipster, Mann: +1: – Xlee

0
import java.util.*; 
import java.lang.*; 
class Demo 
{ 
public static void main(String[] args) 
{ 

Scanner sc=new Scanner(System.in); 
System.out.println("Enter String"); 
String s1=sc.nextLine(); 
try{ 
HashSet<Object> h=new HashSet<Object>(); 
for(int i=0;i<s1.length();i++) 
{ 
h.add(s1.charAt(i)); 
} 
Iterator<Object> itr=h.iterator(); 
    while(itr.hasNext()){ 
    System.out.println(itr.next()); 
    } 
    } 
    catch(Exception e) 
    { 
    System.out.println("error"); 
    } 
} 
} 
+1

Können Sie eine Erklärung hinzufügen? Vielen Dank! – MLavrentyev

2

Die akzeptierte Antwort wird nicht alle Testfall zum Beispiel passieren

Eingang - "aaabcdd"

gewünschte Output- "bc"
aber die angenommene Antwort wird -abc

geben

weil das Zeichen eine aktuelle ungerade Anzahl von Malen.

Hier habe ich ConcurrentHasMap verwendet, um Zeichen und die Anzahl der Vorkommen von Zeichen zu speichern, dann entfernte das Zeichen, wenn die Vorkommen mehr als einmal ist.

import java.util.concurrent.ConcurrentHashMap; 

public class RemoveConductive { 

    public static void main(String[] args) { 

     String s="aabcddkkbghff"; 

     String[] cvrtar=s.trim().split(""); 

     ConcurrentHashMap<String,Integer> hm=new ConcurrentHashMap<>(); 
     for(int i=0;i<cvrtar.length;i++){ 
      if(!hm.containsKey(cvrtar[i])){ 
       hm.put(cvrtar[i],1); 
      } 
      else{ 
       hm.put(cvrtar[i],hm.get(cvrtar[i])+1); 
      } 
     } 
     for(String ele:hm.keySet()){ 
      if(hm.get(ele)>1){ 
       hm.remove(ele); 
      } 
     } 
     for(String key:hm.keySet()){ 
      System.out.print(key); 
     } 
    } 
} 
0

Wenn Sie nicht wollen, zusätzlichen Raum nutzen:

String abc="developer"; 

    System.out.println("The unique characters are-"); 

    for(int i=0;i<abc.length();i++) 
    { 
     for(int j=i+1;j<abc.length();j++) 
     { 
      if(abc.charAt(i)==abc.charAt(j)) 
       abc=abc.replace(String.valueOf(abc.charAt(j))," "); 
     } 
    } 
    System.out.println(abc); 

Zeitkomplexität O (n^2) und keinen Raum.

0

Ich benutze diese Art und Weise einzigartig Zeichen zu bekommen

for (int i=0; i< input.length();i++) 
    if(input.indexOf(input.charAt(i)) == input.lastIndexOf(input.charAt(i))) 
     System.out.println(input.charAt(i) + " is unique"); 
Verwandte Themen