使用ArrayList合并排序

时间:2018-05-06 19:36:38

标签: java sorting arraylist merge compiler-errors

我正在尝试将ArrayList的合并排序算法实现为参数。据我所知,代码工作正常,除了我在合并方法中的if语句。我收到二进制运算符'< ='的错误操作数类型错误。我确定这是因为我有两个不兼容的类型进行比较,但我似乎碰到了一堵墙。尽管如此,学习的学生如此指导或指导正确的方向将是非常有帮助的。

我现在用姓氏正确排序了。现在我想知道我需要改变什么才能按名字或ID号排序。如果我能得到一些如何解决这个问题的指导,我将不胜感激。

private static void sortListByID (List<Person> theList) {
   if (theList.size() >= 2) {
      List<Person> left  = new ArrayList<>();
      left.addAll(theList.subList(0, theList.size()/2));
      List<Person> right = new ArrayList<>();
      right.addAll(theList.subList(theList.size()/2, theList.size()));

      sortListByID(left);
      sortListByID(right);
      merge(theList, left, right);
   }
}
private static void merge(List<Person> result, List<Person> left, 
      List<Person> right) {
   int i1 = 0;
   int i2 = 0;

   for (int i = 0; i < result.size(); i++) {
      if (i2 >= right.size() || (i1 < left.size() && 
            left.get(i1).compareTo(right.get(i2)) < 0)) {
         result.set(i, left.get(i1));
         i1++;
      } else {
        result.set(i, right.get(i2));
        i2++;
      }
   }
}

2 个答案:

答案 0 :(得分:1)

您可能应该使用compareTo代替<=,而不能与Person个对象一起使用

left.get(i1) <= right.get(i2)

变为

left.get(i1).compareTo(right.get(i2)) < 0

确保Person实现Comparable接口以使此方法正常工作

答案 1 :(得分:0)

在完成上一个答案时,您不需要使用递归方法对列表进行排序。这将是合并函数,它合并两个列表并根据您的函数对它们进行排序

你必须实现自己的方式来确定哪个人比其他人更早出现

private static void merge(List<Person> result, List<Person> left,
                          List<Person> right) {
    result.addAll(left);
    result.addAll(right);
    result.sort((o1, o2) -> yourSortFunktionHere...);
}