【问题标题】:Java - How do I sort this ArrayList?Java - 如何对这个 ArrayList 进行排序?
【发布时间】:2016-02-01 03:53:41
【问题描述】:

我是 Java 的新手,我才刚刚开始为我的计算机科学大学课程学习它。

我正在编写一个具有 ArrayList 的程序,其中包含名为 individualPersonality 对象,在 PersonalityList 类中声明如下:private ArrayList<Personality> individual;

这些Personality 对象包含一个名为votes 的私有字段,类型为int

我还在 PersonalityList 类中声明了相同的 ArrayList,但名称不同 - rankedList - 就像这样:private ArrayList<Personality> rankedList;

在我的程序中,我创建了一个名为top(int value) 的方法。在这种方法中,我尝试使用 while 循环查看 individual 列表,从该列表中获取对象,前提是它们的索引号低于 value 参数的值,然后将其添加到 rankedList 列表中,然后然后按照votes 字段的顺序对rankedList 列表进行排序,获得最高票数的对象排在列表的首位(索引:0)。目前,这是我的top 方法:

public void top(int value)
{
    int index = 0;
    int listSize = individual.size();
    rankedList = new ArrayList<Personality>();

    if(value > listSize) {
        value = listSize;
    }
    else {
        System.out.println("Error: Enter a positive integer value.");
    }

    if(listSize > 0) {
            while(index < value) {
                Personality prsn = individual.get(index);
                rankedList.add(prsn);
                System.out.println(prsn.getDetails());
                index++;
            }        
    }
    else {
        System.out.println("Error: The array list has no personalities stored inside it.");
    }
}

我目前正在使用Personality 类中定义的getDetails() 方法(包含对象字段)打印由while 循环获得的每个Personality 对象的详细信息,只是为了检查它是否获得了正确的数量对象。

我知道我需要通过查看其他 Stack Overflow 帖子来使用 Collections.sort 功能,但是,即使在查看了这些帖子的答案之后,我也不知道如何在我的代码中实现它。我已经尝试过,但我不断收到一些我不太理解的错误。

任何帮助,最好是具体的代码,将不胜感激。谢谢!


更新:

感谢@camickr 的示例代码。 在我的 Personality 类中,我添加了以下代码:

static class votesComparator implements Comparator<Personality>
{
    public int compare(Personality p1, Personality p2)
    {
    return p1.getVotes() - p2.getVotes();
    }
}

我还在PersonalityList 类中将top 方法编辑为:

if(listSize > 0) {
    while(index < value) {
        Personality prsn = individual.get(index);
        rankedList.add(prsn);
        System.out.println(prsn.getDetails());
        index++;
    }        
    Collections.sort(rankedList);
    System.out.println("Sort by Natural order");
    System.out.println("\t" + people);
}
else {
    System.out.println("Error: The array list has no personalities stored inside it.");
}

但是现在我收到一条错误消息,指出“没有找到适合 sort(java.util.List) 的方法”,调用地址为 Collection.sort(rankedList)。 这是什么原因?

【问题讨论】:

标签: java sorting object arraylist collections


【解决方案1】:

您发布的代码与排序无关。重要的代码是你的Personality 类。你要么:

  1. 需要在你的类上实现 Comparable 或
  2. 创建自定义比较器

这是一个例子,展示了这两种方法的例子:

/*
**  Use the Collections API to sort a List for you.
**
**  When your class has a "natural" sort order you can implement
**  the Comparable interface.
**
**  You can use an alternate sort order when you implement
**  a Comparator for your class.
*/
import java.util.*;

public class Person implements Comparable<Person>
{
    String name;
    int age;

    public Person(String name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public String getName()
    {
        return name;
    }

    public int getAge()
    {
        return age;
    }

    public String toString()
    {
        return name + " : " + age;
    }

    /*
    **  Implement the natural order for this class
    */
    public int compareTo(Person p)
    {
        return getName().compareTo(p.getName());
    }

    static class AgeComparator implements Comparator<Person>
    {
        public int compare(Person p1, Person p2)
        {
            return p1.getAge() - p2.getAge();
        }
    }

    public static void main(String[] args)
    {
        List<Person> people = new ArrayList<Person>();
        people.add( new Person("Homer", 38) );
        people.add( new Person("Marge", 35) );
        people.add( new Person("Bart", 15) );
        people.add( new Person("Lisa", 13) );

        // Sort by natural order

        Collections.sort(people);
        System.out.println("Sort by Natural order");
        System.out.println("\t" + people);

        // Sort by reverse natural order

        Collections.sort(people, Collections.reverseOrder());
        System.out.println("Sort by reverse natural order");
        System.out.println("\t" + people);

        //  Use a Comparator to sort by age

        Collections.sort(people, new Person.AgeComparator());
        System.out.println("Sort using Age Comparator");
        System.out.println("\t" + people);

        //  Use a Comparator to sort by descending age

        Collections.sort(people, Collections.reverseOrder(new Person.AgeComparator()));
        System.out.println("Sort using Reverse Age Comparator");
        System.out.println("\t" + people);
    }
}

【讨论】:

  • @RamPrakash,由 OP 决定。答案的目的不是用勺子喂代码,而是通过演示概念将 OP 指向正确的方向。他们应该能够弄清楚如何根据自己的特定需求自定义代码。
  • @camickr 感谢您的帮助,但请您看看我的问题的“更新”部分,我的更新代码仍然存在问题。
  • @JonathanFrost,您更改了 Personality 类以创建自定义比较器,但您没有在 sort(...) 方法中使用比较器。查看我的工作示例,了解我如何使用 AgeComparator。
【解决方案2】:
Collections.sort(rankedList,new Comparator<Personality>(){
                     public int compare(Personality p1,Personality p2){
                           // Write your logic here.
                     }});

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 2013-07-05
    • 1970-01-01
    • 2011-03-29
    • 2012-02-03
    • 2016-08-28
    • 2011-05-11
    • 2023-02-24
    • 2019-10-05
    相关资源
    最近更新 更多