需要按照java中的名称排序

时间:2014-12-06 09:33:05

标签: java collections

我需要根据名称对列表进行排序,但我能够做到这一点。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaexception;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Admin
 */
class person
{
    int id;
    String name;
};

public class JavaException 
{
    public static void main(String a[])
    {        
        List<person> li =new ArrayList<person>();
        person p=new person();
        p.id=1;
        p.name="Sushant";
        li.add(p);
        person p1=new person();
        p1.id=2;
        p1.name="Atul";
        li.add(p1);
        person p2=new person();
        p2.id=3;
        p2.name="Genu";
        li.add(p2);
        System.out.println(""+li);
        Collections.sort(li);
        for(int i=0;i<li.size();i++)
        {
            person pp=(person)li.get(i);
            System.out.println(""+pp.name);
        }
    }
}

它给我一个错误

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: java.util.Collections.sort
[javaexception.person@14b7453, javaexception.person@c21495, javaexception.person@1d5550d]
    at javaexception.JavaException.main(JavaException.java:41)

3 个答案:

答案 0 :(得分:3)

使用Collections.sort(List<T> list)时,编译器要求类型T必须具有可比性(<T extends Comparable<? super T>>)。

您的Person课程并非如此。要使Person类具有可比性(通过实现Comparable接口),或使用重载的sort方法提供自定义比较器。

答案 1 :(得分:2)

根据仅使用list作为参数的sort方法的文档,它说:

Sorts the specified list into ascending order, according to the
Comparable natural ordering of its elements.
All elements in the list must implement the Comparable
interface.  Furthermore, all elements in the list must be
mutually comparable (that is, e1.compareTo(e2)
must not throw a ClassCastException for any elements
e1 and e2 in the list).

因此,您的人员类本身无法比较,因此您可以通过两种方式解决此问题:

  • 为您的person类实现Comparable接口并实现compareTo方法。类似的东西:

    class person implements Comparable<person>
    {
    int id;
    String name;
    @Override
    public int compareTo(person o) {
      return this.name.compareTo(o.name);
    }
    };
    
  • 使用另一种排序api,它将比较器作为参数:

    Collections.sort(li, new Comparator<person>() {
    @Override
    public int compare(person o1, person o2) {
    return o1.name.compareTo(o2.name);
    }});
    

答案 2 :(得分:1)

每当您在对象列表上调用Collections.sort()时。然后java不知道要对哪个字段进行排序。在你的情况下,你有id和名字。 java将如何推断您是否要对名称或ID进行排序。 因此,您需要提及排序标准。

为此,您可以执行以下操作: -

让你的人类扩展可比性

class person implements Comparable

然后实现compareTo方法。因此,当您调用Collections.sort()时,java将调用person.compareTo来比较和排序对象。

另一种方法是使用比较器

http://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/