2017-05-02 6 views
4

次の文字列があれば。配列内に5つ以上の反復要素を得る方法

String inStrings[] = {"A", "B", "C", "D", "E", "F", "G", "H", "A", "B", "C", "D", "E", "A", "B", "C", "D", "A", "B"}; 

この配列は後でメソッドに渡されるため、どのように処理するかわかりません。このメソッドが行うことになっている何

static void getColdSearch(String[] inArray){ 



} 

は、配列を取る以上繰り返した文字列を取得し、出力に5つの以上の繰り返し文字列をプリントアウトすることです。繰り返す文字列は互いに隣り合っている必要はなく、5つ以下の文字列がある場合はすべてが出力の一部でなければなりません。例えば。 arraylistが上記の例のように見える場合、出力は次のようになります。

F //(Occurs once) 
G //(Occurs once) 
H //(Occurs once) 
E //(Occurs twice) 
D //(if two different elements repeat the same number of times a random one of them should be printed) 

どうすればいいですか?

+2

「Map」を使用し、配列の文字をキーとして値をカウンタにします。次に、最も低い値を持つ5を見つけると、あなたは設定されています。それに乗りなさい。 – AntonH

+0

ステップ1.各要素を数えます。ステップ2は、カウントを最も少ない頻度から最も高い頻度まで裁定する。手順3は、手順2で作成したソート済みリストの最初のファイル要素を返します。 – DwB

+2

まず_something_を試してください。それが機能しない場合は、助けを求める。あなたのために何かを解決するように私たちに依頼しないでください。 – lucasvw

答えて

4

試しのJava 8つの機能

import java.util.Arrays; 
import java.util.List; 
import java.util.Map; 
import java.util.function.Function; 
import java.util.stream.Collectors; 

public class GroupingDemo { 

    public static void getColdSearch(String[] inArray) { 
     Map<String, Long> groupingByLetter = Arrays.stream(inArray) 
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 

     List<String> result = groupingByLetter.entrySet().stream() 
      .sorted(Map.Entry.comparingByValue()) 
      .limit(5) 
      .map(Map.Entry::getKey) 
      .collect(Collectors.toList()); 

     System.out.println(result); 
    } 

    public static void main(String[] args) { 
     String inStrings[] = {"A", "B", "C", "D", "E", "F", "G", "H", "A", "B", "C", "D", "E", "A", "B", "C", "D", "A", "B"}; 
     getColdSearch(inStrings); 
    } 
} 
1

は最大ヒープ(プライオリティキュー)とハッシュマップを使用してください。

マップ内のデータをチェックし、キューに

を保存する最初の5つのユニークな言葉のために、配列を

をクラス

  Class WordCount 
      { 
      String word; 
      int count; 
      } 
      PriorityQueue<WordCount>queue // queue to save minimum repeated words 
      HashMap<String,Integer>map // save data for each word 

ループを作成します。単語が存在する場合は、カウントを更新する

キューの先頭要素をチェックします。単語の数が現在の索引語よりも高い場合は、単語をキューから削除してこの単語を追加します。 ループの最後までプロセスを繰り返します。最後のポーリング上で概説したようあなたは、Java 8を使用することができますキュー

2

からすべての要素で

。ここでは、Java 7以前でどのように同じことができるかを理解するのに役立つ解決策があります。さらに、実際にボンネットの下で何が起こっているのかを理解することは役に立ちます。

static void getColdSearch(String[] inArray) { 
    Map<String, Integer> counterMap = new HashMap<>(); 


    // load the array in a Map instance 
    for (String in : inArray) { 
     if (null != counterMap.putIfAbsent(in, 1)) { 
     counterMap.put(in, counterMap.get(in) + 1); 
     } 
    } 

    // Question: why do we need a priority queue? 
    // We could also use sort based on the values. Search 
    // stackoverflow.com for "sorting on map value" 
    PriorityQueue<String> heap = new PriorityQueue<>(new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
     // sort based on the count. 
     return counterMap.get(o1).compareTo(counterMap.get(o2)); 
     } 

    }); 


    heap.addAll(counterMap.keySet()); 

    int size = heap.size(); 
    for (int i = 0; i < size; i++) { 
     // you could end it a "5" but I leave that as an exercise. 
     String s = heap.poll(); 
     System.out.println(s + " count: " + counterMap.get(s)); 
    } 
} 
+1

ありがとうございました!これは本当に助けになった! – VICWICIV

関連する問題