2016-11-28 7 views
-1

私は2つのリストを持ち、各リストから要素を含むストリングを作成しようとしています。その間に、" "を実行するとソートされた順序が維持されます。しかし、私がしたいと思う中間に"|"を置くと、セット内の要素の順序が入れ替えられます。なぜ「|」を追加するのですか? Javaで設定する要素の順序をフリップ?

"|"を追加するにはどうすればいいですか?セットstudentsでソートされた順序を維持しますか?ここで

コードです:... + " " + ...

Set<String> students = new HashSet<>(); 
    Set<String> fn = new HashSet<>(); 
    Set<String> nums = new HashSet<>(); 

    List<String> firstNames = new ArrayList<>(fn); 
    Collections.sort(firstNames); 

    List<String> favNumbers = new ArrayList<>(nums); 
    Collections.sort(favNumbers); 

    for(int i=0; i<firstNames.size(); i++) { 
     students.add(firstNames.get(i) + "|" + favNumbers.get(i)); 
    } 

    System.out.println(students); 

、順序が[Joshua 4, Lyon 7]ですが、"|"" "の代わりに追加された場合、順番は私が欲しいとき[Lyon|7, Joshua|4]なり、[Joshua|4, Lyon|7]でなければなりません。

+2

私は完全だと思います正しいアプローチは、別の姓と姓のフィールドを使用して並べ替えるカスタムコンパレータと一緒に学生POJOを持つことです。 –

+0

@TimBiegeleisenどのようにして自分のアプローチにリビジョンを作って、自分が望むように動作させることができますか? –

+0

しかし、何らかの理由で学生が名前のパイプを持っていたらどうなりますか? –

答えて

2

HashSetは、要素のhashCode()に基づいて、基礎となるHashMapが生成する順序を使用して、その内容についての順序保証を提供しません。

文字列の内容を変更すると、別のハッシュコードが得られます。 HashMapの順序は定義されておらず、再ハッシュをトリガする要素を追加した場合に変更される可能性があります。

注文が保証されたセットをご希望の場合は、SortedSetの実装(TreeSetなど)を使用できますが、適切なクラスを作成し、適切なComparatorを実装する必要があります。代わりに、LinkedHashSetを使用すると、追加のオーバーヘッドを犠牲にして要素を挿入順序で維持できます。 documentation for HashSetから

+0

'students'の' HashSet <>(); 'の代わりに、どうすればいいですか? –

+0

@JoKo文字列貼り付けや並列配列ではなく、「Student」クラスが必要です。 – chrylis

+0

要素が挿入された順番で印刷したいので、Joshua | 4が最初に追加された場合は、印刷時に最初の要素にしたいと思います。また、「Student」クラスを作成することは過度のようです。どんな簡単なアプローチですか? –

0

それはセットの繰り返し順序について保証しません。特に、注文が時間の経過とともに一定であることを保証するものではありません。

したがって、HashSetを使用してあらゆる種類の注文を維持することはできません。

あなたはちょうどあなたがオブジェクトを使用する必要があります

List<String> students = new ArrayList<>(); 
2

、例えば、あなたがSetむしろListを使用していない方がいいでしょう。その場合には、挿入の順序を保持する必要があるようですが、私には見えますJavaはオブジェクト指向言語なので、指向の設計です。生徒のさまざまな機能を独立したコレクションとして表現する代わりに、これらの機能を含むStudent POJOを作成します。次に、カスタムコンパレーターを作成して、名前またはお気に入り番号のいずれかでソートします。

あなたが学生、 List<Student> listのリストを持っている場合今、あなたが経由で並べ替えることができます
public class Student { 
    private String firstName; 
    private String lastName; 
    private int favNumber; 

    // getters and setters 

    public static Comparator<Student> NameComparator 
         = new Comparator<Student>() { 

     public int compare(Student s1, Student s2) { 
      String f1 = s1.getFirstName(); 
      String f2 = s2.getFirstName(); 
      String l1 = s1.getLastName(); 
      String l2 = s2.getLastName(); 
      if (l1.equalsIgnoreCase(l2) { 
       return f1.toUpperCase().compareTo(f2); 
      } 
      else { 
       return l1.toUpperCase().compareTo(l2); 
      } 
     } 
    }; 

    public static Comparator<Student> FavComparator 
         = new Comparator<Student>() { 

     public int compare(Student s1, Student s2) { 
      return s1.getFavNumber() < s2.getFavNumber(); 
     } 
    }; 
} 

Collections.sort(list, Student.NameComparator); 

または、好きな番号で使用をソートする:

Collections.sort(list, Student.FavComparator); 
関連する問題