我正在为我正在制作的纸牌游戏制作一个高分榜的广告。这个arraylist可以存储的分数需要有限的限制,系统的用户可以定义(现在让我们说10)。 arraylist中对象中的字段是玩家的名字(字符串),他们的得分(int)和玩家的(几乎)唯一ID(Long,System.currentTimeMillis())。 arraylist应按分数排序,其中最低分数最佳。但是,如果arraylist中的所有玩家具有相同的分数并且添加了该分数的新玩家,我希望具有最新分数的玩家(ID最高的玩家)存储在较旧的玩家之前,所以旧的被丢弃了。
基本上我需要一种方法来按两个字段对ArrayList进行排序 - 首先得分,从低到高,然后如果得分匹配则按ID排序。删除我已经覆盖的多余元素,尽管如果有一种集成方式我会有兴趣听到它。
编辑:我正在尝试对具有这些属性的对象的Arraylist进行排序,而不是仅仅抛出它们的单个arraylist。我的不好。答案 0 :(得分:5)
如果使用Java 8,可以使用方法引用嵌套比较器:
List<Player> players = // ...
players.sort(Comparator
.comparing(Player::getScore)
.thenComparing(Player::getId));
可以在Comparator
JavaDoc找到更多信息。
答案 1 :(得分:3)
不要使用ArrayList来保存您的数据。
使用Id,name,score ...属性创建自定义对象。然后创建自定义Comparator
,
以下是一个简单的自定义对象和自定义Comparator的示例。您可以修改Comparator以实现您刚才描述的逻辑。
/*
** 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);
}
}
答案 2 :(得分:2)
您可以使用Collections.sort()
Class Student{
String fname="";
String lname="";
int age =0;
int score=0;
public Student(String fname,String lname,int age, int score)
{
this.fname=fname;
this.lname=lname;
this.age=age;
this.score=score;
}
}
排序我的列表
ArrayList<Student> list = new ArrayList<Student>();
/*add elements*/
Collections.sort(list, new Comparator<Student>()
{
@Override
public int compare(Student x, Student y)
{
if(x.score == y.score)
{
return (y.age-x.age);
}
else
return (y.score-x.score);
}
});