2017-10-25 9 views
0

私はユーザー定義クラスのソートセットを実装しており、compareToメソッドをComparableインターフェイスのユーザー定義クラスに実装しています。今では私の要件は、文字(つまり〜z)がすでに存在している場合で、文字の頻度を増やし、他の方法ではその頻度に応じて入力を並べ替えます。ソート済みセットとの混乱Java

String s = "abc"; // or "aaaab" or any set of string between [ a - z ] 
SortedSet<FreequencyIndex> sortedSet = new TreeSet<FreequencyIndex>(); 
    FreequencyIndex symbol; 
    for(int index = s.length() - 1; index >=0 ; index--){        
     symbol = new FreequencyIndex(s.charAt(index), index, 0);    
     sortedSet.add(symbol);    
    } 

System.out.println(sortedSet); 

ユーザ定義のクラス:Sは= "" 入力の

class FreequencyIndex implements Comparable<FreequencyIndex>{ 
    char symbol; 
    int index; 
    int frequency; 

    public FreequencyIndex(char newSymbol, int newIndex, int newFrequency){ 
     this.symbol = newSymbol; 
     this.index = newIndex; 
     this.frequency = newFrequency; 
    } 

    @Override 
    public String toString(){ 
     return this.symbol + " "+ this.frequency; 
    } 

    @Override 
    public int compareTo(FreequencyIndex f2){    
     if(this.symbol == f2.symbol){  
      f2.frequency++; 
      return 0; 
     } 
     else    
     if(this.frequency > f2.frequency) 
      return 1; 
     else    
      return -1; 


    } 
} 
  1. - >ソートセットは以下のようになり[0]は、それが与えている[1]
  2. について入力S = "ab" - >ソートされた集合は[a 0、b 0]であるが、[a 0、b 1]を与える。
  3. 入力S = "aba" 、a 2]を与えるが、[b 0、a 2]を与える。
  4. 入力S = "aab" - >ソートされたセットは[b 0、a 2]ですが、[a 1、b 1]を与えています

私はここで何か説明できますか?

+5

私は 'compareTo'が副作用を持っているべきではないと確信しています。 – Eran

+0

何とは? sの定義/初期化は含まれていません。 – Tschallacka

+0

は、異なる文字セットの文字列です。例:s = "aab"または "babcz"何か。 –

答えて

1
SortedSetは、何らかの並べ替えを持つセットであり、最も悪名高いものは TreeSetです。ただし、ソートは、 addを呼び出すときにノードがすでに存在するかどうかを調べるためにも重要です。したがって、シンボルとは別のものでソートするソリューションでは、ソートが中断されます。

また、TreeSet,HashSetなどのセットに何かを追加すると、オブジェクトを変更する必要はありません。少なくとも、比較に使用するフィールドは変更する必要がありません。つまり、オブジェクトを何とか変更すると、equalscompareTohashCodeなどのメソッドは同じ値を返す必要があります。そうでないと、セットが正しく動作せず、重複が表示されることさえあります。

あなたの状況で最も清潔な解決策は、FrequencyIndexをキーに使用することではなく、シンボルでの検索にMap<Character, FrequencyIndex>を使用することです。新しい要素を追加するプロセスでソートされたセットが複数回必要な場合を除いて、周波数チェックを完了した後でソートするだけで、Java 8ストリームを使用して次のコードでマップを簡単に実行できます。

map.values().stream() 
    .sorted(Comparator.comparing(FrequencyIndex::getFrequency)) 
    .collect(Collectors.toList()); 

上記の頻度のゲッター - 私はあなたがFrequencyIndexクラスにゲッターを加えるべきだと思います。

効率性実際には、周波数チェック中に並べ替えが行われず、すべて入力サイズに比べて小さなセットで1回だけ行われます。

+0

これは素晴らしい入力であり、本当に感謝しています。 –