【问题标题】:How to sort List of User-defined type in Java?如何在 Java 中对用户定义类型列表进行排序?
【发布时间】:2013-08-26 19:08:26
【问题描述】:

我目前正在学习如何使用 Java 中的列表。我遇到过使用 Collections.sort() 方法对列表中的字符串进行排序,并且效果很好。但是,当我创建用户定义的数据类型时,它不会排序并给出错误 -

“找不到适合排序的方法(列表) 方法 Collections.sort(List,Comparator) 不适用 (不能从参数实例化,因为实际参数列表和形式参数列表的长度不同) 方法 Collections.sort(List) 不适用 (推断类型不符合声明的边界) 推断:孩子 界限:可比) 其中 T#1,T#2 是类型变量: T#1 扩展了方法 sort(List,Comparator) 中声明的 Object T#2 扩展了方法 sort(List) 中声明的 Comparable"

如何对用户定义类型的元素进行排序?

这里是代码 -

代码 -

package works;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Collections;

class Child 
{
private String name;
public Child(String name)
{
    this.name=name;
}
@Override
public String toString()
{
    return name;
}
}
class LOL
{
void Meth()
{
    Child s1 = new Child("Hi");
    Child s2 = new Child("Bye");
    Child s3 = new Child("And");
    List<Child> f1 = Arrays.asList(s1,s2,s3);
    System.out.println(f1);
    System.out.println();
    Collections.sort(f1);  // This line is the erroneous line.
}
}
public class SortColl
{
public static void main(String X[])
{
    LOL l = new LOL();
    l.Meth();

}
}

【问题讨论】:

标签: java list sorting arraylist


【解决方案1】:

Child 类中实现Comparable

class Child implements Comparable<Child>{
    private String name;

    public Child(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public int compareTo(Child child) {
        return name.compareTo(child.name);
    }
}

【讨论】:

  • 这有效,但排序是降序的?如何按升序对其进行排序?
  • @Sidsec9 将compareTo 方法更改为return name.compareTo(child.name) 或更简单:只需将结果乘以-1return -1 * child.name.compareTo(name);。顺便说一句,在此处发布问题之前先做一些努力
  • @LuiggiMendoza,谢谢你的帮助,我一直在尝试这段代码工作一整天都没有成功,我没有注意到返回类型是 int 出于绝望,否则我会尝试将它与-1相乘。下次我会注意的。
  • @Reimeus 我还有一个疑问,假设 Child 类和 LOL 类是不同的类并且属于同一个包。包被导入,并且有一个约束,即不得在 Child 类中进行任何更改(如实现 Comparable),并且所有必要的修改都将在 LOL 类中完成,那么您将如何对列表进行排序?跨度>
  • @Sidsec9 在这种情况下,您需要使用 Comparator 并使用它来比较 2 个 Child 对象的 name 字段
【解决方案2】:

要对任何对象的集合进行排序,必须满足以下条件之一:

  1. 对象必须实现Comparable。在这种情况下,实现Comparable&lt;Child&gt;。然后Collections.sort 将能够使用compareTo 方法进行排序。
  2. 创建您自己的实现Comparator 的类,特别是Comparator&lt;Child&gt;,并将该类的实例作为第二个参数传递给Collections.sort。然后排序算法将使用Comparator 对集合进行排序。

【讨论】:

  • +1 表示Comparator&lt;Child&gt;。在对无法更改的类进行排序,或者需要进行一次性排序,或者对已经以不同方式实现 Comparable 的类进行排序时,它非常有用。
猜你喜欢
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 2015-08-08
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多