2016-11-28 62 views
-1

我有两个列表,并试图与每个列表中的元素形成一个字符串,并在之间当我做" ",排序顺序保持。但是,一旦我将"|"放在中间,我想要的是,Set中元素的顺序会切换。为什么添加“|”在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

我觉得完全:

Collections.sort(list, Student.NameComparator); 

或者,通过喜爱的数字,使用排序正确的方法是将学生POJO与自定义比较器一起使用,该比较器使用单独的名字和姓氏字段进行排序。 –

+0

@TimBiegeleisen如何才能对我的方法进行修改并使其按照我想要的方式工作? –

+0

不太可能,但如果出于某种原因,如果学生在他的名字中有管道,会发生什么? –

回答

2

HashSet甲不提供任何排序​​保证知道其内容,使用任何排序底层HashMap生成,这又基于元素的hashCode()

当你改变一个字符串的内容时,你会得到一个不同的哈希码 - 这很简单。 HashMap中的订单未定义,如果插入了触发重新散列的其他元素,则该订单可能会更改。

如果你想要一套有保证的顺序,你可以使用一个SortedSet实现(如TreeSet),但你需要编写一个适当的类,并采取适当的Comparator秒。或者,您可以使用LinkedHashSet,它以牺牲额外开销为代价维护插入顺序中的元素。

+0

然后,而不是'HashSet <>();'为学生',我应该使用什么? –

+0

@JoKo你应该有一个'Student'类,而不是字符串粘贴或并行数组。 – chrylis

+0

我只是想按照插入元素的顺序打印,所以如果第一次添加了Joshua | 4,那么打印时会首先将它作为第一个元素,创建一个Student类似乎是一种矫枉过正。任何更简单的方法? –

0

documentation for HashSet

它不保证为向集合的迭代顺序;特别是,它不能保证订单会随着时间的推移保持不变。

所以你不能依靠HashSet来保存任何种类的订单。

它看起来对我来说,你只需要保持插入的顺序,在这种情况下,你最好不使用Set和宁List,例如,

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

您应该使用对象因为Java是面向对象的语言。不要试图将学生的各种特征表现为独立的集合,而要创建包含这些特征的POJO Student。然后,创建自定义比较器,按名称或最喜欢的数字进行排序。

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

现在,如果你有个同学,List<Student> list列表,您可以排序通过:

Collections.sort(list, Student.FavComparator); 
相关问题