【问题标题】:Sort List Comparing with String Array排序列表与字符串数组比较
【发布时间】:2021-07-07 04:29:59
【问题描述】:

我有一个对象列表和一个字符串数组,如下所示。如何根据我的数组对对象列表进行排序?是否可以使用 java 比较器和 collection.sort() ?

等级对象

Class Grade{
   private Long keyId;
   private String gradeName;
   private int classCount;
}

成绩单

 List<Grades> grades= new ArrayList<>();

字符串数组

String[] gradeOrder= {"year 1", "year 2", "year 3", "year 4"};

【问题讨论】:

  • 简单的解决方案是让Grades 对象实现Comparable 然后您可以简单地使用Collections.sort(grades, yourCustomComparator); 其中Comparator&lt;Grades&gt; yourCustomComparator = (Grades g1, Grades g2) -&gt; g1.gradeName.compareTo( g2.gradeName);。这将使用正常的字符串排序,谢天谢地,我们可以将其用于您的列表,因为第 1 年到第 4 年都已按顺序排列。
  • @sorfiend 如果数组如下所示怎么办? String[]gradeOrder= {"第 3 年"、"第 2 年"、"第 1 年"、"第 4 年"};
  • 那么你的代码可能会很快变得混乱,我鼓励你使用一个enum,它代表一个与比较器一起使用的变量,例如String YEAR_3 = "sort_1";String YEAR_2 = "sort_2";或者映射整个列表并使用作为你的比较器

标签: java sorting collections comparator


【解决方案1】:

试试这个。

List<Grade> grades = new ArrayList<>();
// add Grade instances to grades
String[] gradeOrder = {"year 1", "year 2", "year 3", "year 4"};
Map<String, Integer> gradeMap = IntStream.range(0, gradeOrder.length)
    .boxed()
    .collect(Collectors.toMap(i -> gradeOrder[i], Function.identity()));

Collections.sort(grades,
    Comparator.comparing(grade -> gradeMap.get(grade.getGradeName())));

【讨论】:

    【解决方案2】:

    使用List.sort(Comparator&lt;? super E&gt; c),提供一个包含订单结构(您的gradeOrder 数组)的自定义比较器,或为您的Grade 类实现equals() 方法以进行更方便的比较(但您可能会通过提供一个一定的顺序结构)。

    https://docs.oracle.com/javase/8/docs/api/java/util/List.html

    您可能想尝试一些像 lombok 这样的库,它有一个 @EqualsAndHashCode 注释来自动为您的类生成这些方法。

    https://projectlombok.org/features/EqualsAndHashCode

    【讨论】:

      猜你喜欢
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2012-08-22
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多