尝试使用Comparable,我对编程很新,并且从未对ArrayList进行排序 . 我已经看了一些关于堆栈溢出的其他示例并查看了Java Doc但是它相当令人困惑,我不确定如何将它应用到我的程序中
基本上我有两个类,一个Personality类和一个PersonalityList类 . PersonalityList类包含一个名为personalities的Personality数组,它在Array List中存储了许多个性对象 .
我需要按每个人格的投票数对其进行排序 . 方法top(int topValue)应该返回一个长度为topValue的新数组,其中Personality对象的投票率最高 .
我知道我需要在Personality类中使用一些Comparable,但不确定如何执行此操作 .
到目前为止,这是我的PersonalityList类:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Collections;
public class PersonalityList
{
private ArrayList<Personality> personalities; //Create ArrayList of Personality, called personalities.
private ArrayList<Personality> sortedPersonalities;
/**
* Constructor for objects of class PersonalityList
*/
public PersonalityList()
{
personalities = new ArrayList<Personality>(); //Initialise personalities ArrayList.
sortedPersonalities = new ArrayList<Personality>();
}
/**
* Adds a personality to the ArrayList of Personality, called personalities.
*/
public void addPersonality(Personality personality)
{
personalities.add(personality);
}
/**
* Returns the number of Personality objects in the ArrayList
*/
public int getSize()
{
return personalities.size();
}
/**
* Lists the details of all the Personality objects stored in the ArrayList
*/
public void list()
{
System.out.println("Personality List");
for(Personality personality : personalities) { //Iterates through each personality in ArrayList
System.out.println(personality.getDetails());
}
System.out.println();
}
/**
* Adds one vote to the personality which matches the name entered into the method
*/
public void voteFor(String name)
{
boolean nameFound = false; //Boolean variable to identify if the personality has been found
int index = 0;
while (index < personalities.size() && !nameFound) {
Personality personality = personalities.get(index);
String compName = personality.getName();
if (compName.equals(name)) { //Adds a vote if the name is found
personality.increaseVotes(1);
nameFound = true;
}
index++;
}
if (nameFound == false) { //Error message if name not found
System.out.println(name + " could not be found.");
}
}
/**
* Removes personalities if they have less votes than the parameter value
*/
public void shortlist(int minimumVotes)
{
Iterator<Personality> it = personalities.iterator();
while(it.hasNext()) {
Personality personality = it.next();
int currentP = personality.getVotes();
if (currentP < minimumVotes) {
it.remove();
}
}
}
/**
*
*/
public Personality top(int topValue)
{
int index = 0;
int listSize = personalities.size();
if (topValue > listSize) {
topValue = listSize;
}
if(listSize > 0) {
//Coppies the ArrayList personalities to the sortedPersonalities ArrayList
while(index < topValue) {
Personality sortedPersonality = personalities.get(index);
sortedPersonalities.add(sortedPersonality);
System.out.println(sortedPersonality.getDetails());
index++;
}
Collections.sort(sortedPersonalities, Collections.reverseOrder(new Personality.votesComparator()));
System.out.println("Sorted by Votes");
System.out.println("\t" + people);
}
else {
System.out.println("No personalities are currently in the Array List");
}
return sortedPersonalities ;
}
}
提前致谢 .
3 回答
或者您可以使用如下的lambda表达式轻松地在对象之间进行比较:
Assume that we have a list of Person with their ages;
我们可以使用
Comparator
界面比较这些人的年龄然后我们可以将这些人分类为List:
这是我尝试显示为自定义对象创建Comparator的完整示例:
列表可以包含两次元素 . 在这种情况下,谁将成为第一个谁是第二个?答案很模糊,因此他们决定不通过比较器对列表进行排序 .
也许你正在寻找
TreeSet
(谁拥有可比性的自然支持)?Set
不能多次包含元素 .你可能会说: Hey, i realy often have collections without the need of duplicates but i always use lists! . 是的,这是一个广泛传播的错误 .
请使用Set让世界知道:没有重复 .