2016-11-30 11 views
5

文字列に一意の文字(スキャナで入力)を印刷するプログラムを作成しています。私はこれを達成しようとするメソッドを作成しましたが、文字列に固有の文字(または文字)ではなく、繰り返しではない文字を取得し続けます。私は一意の手紙だけが欲しい。ここでJava:文字列に一意の文字を表示します。

は私のコードです:

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 + " "); 

    } 
}    

そしてここでは、上記のコードのサンプル出力です:

Enter a word: 
nreena 
nrea 

予想される出力は次のようになります。ご希望の出力に基づいてra

+0

を取得するには、この方法を使用しますか – developer

+1

しかし、 'e'は繰り返しですが、あなたはまだそれを手に入れています。希望の出力は 'ra'ですか? – Gendarme

+0

とにかく、私は 'char [] array = testのようなことをします。toCharArray(); 'を実行し、' test'の各文字について 'array'をループし、一致するものがなければ' temp = temp + test.charAt(i); 'を実行します。 – Gendarme

答えて

5

、あなたが持っています最初にすでに追加されている文字が後で重複している場合はその文字を置き換えます。

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

これは*効率的です! – Xlee

+0

@Xlee、ありがとう – lmiguelvargasf

+0

ありがとうございました! – Dextra

2

解決策にアプローチするには、文字列だけでなく、より良いデータ構造を試してみることをお勧めします。次のようにしかし、あなたは単にelseを使用して、既存の重複を削除するためにあなたのロジックを変更することができます。

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

これは面白そうですが、私の答えとあなたのものはほぼ同じですが、変数の名前だけが変更されています。しかし、私はこの変数を使用できるときに使用しました。つまり、 'test.charAt(i) 'を複数回返すことはありません。 – lmiguelvargasf

+0

正しい使用を繰り返すべきではありません。 OPコードを最適化しようとしていました。それを逃した。 – nullpointer

0

現在の文字が表示された場合、私はあなたを介してループをチェックするだろう、配列内の文字列のすべての文字を格納しますそこには複数回あります。そうでない場合は、tempに追加してください。

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

私はいくつかの詳細についてコメントを追加しました。 - "bc"
出力 - 希望"aaabcdd"

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

受け入れられた答えは-abcを与えるでしょう

現在の奇数回の文字であるため、

です。

ここでは、文字を格納するためにConcurrentHasMapを使用し、発生した文字が複数ある場合はその文字を削除しています。

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

Hipster、man:+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

説明を追加できますか?ありがとう! – MLavrentyev

2

受け入れ答えは、例えば

入力をすべてのテストケースに合格しません:KISS原理を応用についてどのように

0

追加のスペースを使用しない場合:

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

時間の複雑さはO(n^2)とノースペースを。

0

私は「nreena」の予想される出力とは何ですか?ユニークな文字

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"); 
関連する問題