【问题标题】:Merge sort with ArrayList使用 ArrayList 进行合并排序
【发布时间】:2018-10-16 15:27:56
【问题描述】:

我正在尝试将 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++;
      }
   }
}

【问题讨论】:

  • left.get(i1) &lt;= right.get(i2) 只能使用
  • 只是指出,我认为Collections.sort() 是一个稳定的合并排序。
  • left.get(i1)right.get(i2) 返回一个类型为 Person 的对象,不能使用 'Comparable,这将允许您比较两个对象。
  • 谢谢!这完全有道理,我忘了它是一个对象,而不是原始类型。

标签: java sorting arraylist merge compiler-errors


【解决方案1】:

您可能应该使用compareTo 而不是&lt;=,后者不能与Person 对象一起使用

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

变成

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

确保Person 实现Comparable 接口以使此方法起作用

【讨论】:

  • 谢谢!完全忘记了使用可比较的
【解决方案2】:

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

您必须实施自己的方式来确定哪个人比另一个人来得早

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2022-01-10
    • 2016-01-06
    • 1970-01-01
    • 2012-09-28
    • 2014-01-14
    相关资源
    最近更新 更多