2016-09-27 6 views
0

文字列の配列内のすべての繰り返し項目を探したいと思います。
と仮定私はしました:文字列の配列内の重複していない項目をすべて見つける方法はありますか?

String[] str = {"Red", "Red", "Green", "Green", "Blue"}; 

私はそれが再び繰り返されていないよう「ブルー」を見つけるしたいと思います。

どうすればこの問題を解決できますか?

+0

複雑さは何ですか、配列の大きさはどれくらいですか?必要なコードの複雑さは何ですか? – prabodhprakash

+0

マップ、カスタム関数、イテレータなどのソリューションがありますが、ファンタスティックになりたい場合は、正規表現を使用してください。その良い演習と学習正規表現を楽しむことができます。 – Cyclotron3x3

答えて

2

解決策の1つは、文字列をキーとして、整数を値として作成することです。配列を繰り返し処理し、マップ内の文字列の量を増やす必要があります。

String[] str = {"Red", "Red", "Green", "Green", "Blue"}; 
Map<String,Integer> stringsCount = new HashMap<String,Integer>(); 

for (String s : str){ 
    if (!stringsCount.containsKey(s)) 
     stringsCount.put(s, 1); 
    else 
     stringsCount.put(s, stringsCount.get(s) + 1); 
    } 

そして、あなたは一度だけカウントしたすべての文字列印刷することができます:あなたは

for (Map.Entry<String, Integer> entry : stringsCount.entrySet()) 
    if (entry.getValue() == 1) 
     System.out.println(entry.getKey()); 
+0

Tx sir .. これは単なる単純なことでしたが、私はこれをやろうとしていましたが、このような使い方は私にはなかったのです。 – ARP

+0

@ARP私の答えを正しいものとして受け入れることができますか?乾杯。 –

0

を可能性があります。array

  • は空のリスト
  • 反復を作成

    • ソートソートされた配列の上に:もし要素==前の要素なら、何もしないでください。前の要素をliに追加してくださいst

    繰り返しの最後に、リストには一意の要素のみが含まれます。

    これは(明らかに)元の順序を保持しないことに注意してください。

  • 0

    これにはHashSetを使用できます。たとえば、これは動作するはずです:

    Set<String> getUniqueWords(String[] words) { 
        Set<String> uniqueWords = new HashSet<>(); 
        Set<String> foundWords = new HashSet<>(); 
    
        for (String word : words) { 
         if (foundWords.contains(word)) { //O(1) 
          uniqueWords.remove(word); //O(1) 
         } else { 
          uniqueWords.add(word);  //O(1) 
         } 
         foundWords.add(word);   //O(1) 
        } 
    
        return uniqueWords; 
    } 
    

    だから、このアプローチを使用してあなたは、配列を単一のループ内で一意の単語を取得するので、あなたは、(理論的に)線形時間複雑性を持つことになります。

    関連する問題