嗯,我有一些非常简单的东西,但我无法理解。
首先,我知道有Collection.sort()
方法,但是我的ArrayList是到主对象的数据的链接,我需要根据这个对象的数据进行排序。
就像这是一项体育比赛,而ArrayList<Integer> numbers
正在保持已通过检查站的参与者数量。
我需要按照从最小到最大的最佳时间对这个ArrayList进行排序,以便将它们设置在第一位,第二位等人身上。
为此,我应该问我的竞争对象:
public ArrayList<Integer> sort (ArrayList<Integer> numbers)
for (int i=0;i<numbers.size){
long time = competition.participant.get(numbers.get(i)).getTimeOfLastCheckPoint();
/*Do something to make another ArrayList<Integer> sortedArray
where all this will be sorted by this time parameter from minimal to maximum*/
return sortedArray;
}
这不是实际的代码,但你已经有了这个想法。我坚持试图找到看似简单的解决方案。 请帮忙
答案 0 :(得分:3)
基于其他与您实际想要排序的东西没有直接关系的东西 - 时间来排序ArrayList<Integer>
似乎很尴尬。
我会以不同的方式设计它。看起来您已经定义了某种对象,您可以在其上调用getTimeOfLastCheckPoint()
。现在,我假设它被称为Participant
。我保留ArrayList<Integer>
,而不是维持ArrayList<Participant>
存储基于索引的参与者,我会保留Comparator<Participant>
。
然后我会创建一个实现ParticipantComparator
(可能Participant
)(Comparator
javadocs)的类,它知道如何根据调用的结果比较getTimeOfLastCheckPoint()
Collections.sort(participantsArrayList, new ParticipantComparator());
。然后排序只是{{1}}。
答案 1 :(得分:3)
编写一个java.util.Comparator
,将Integer
用作参与者数组中的索引进行比较:
public class ParticipantIndexComparator implements Comparator<Integer> {
final List<Participant> participants;
public ParticipantIndexComparator(List<Participant> participants) {
this.participants = participants;
}
@Override
public int compare(Integer i1, Integer i2) {
long l1 = participants.get(i1).getTimeOfLastCheckPoint();
long l2 = participants.get(i2).getTimeOfLastCheckPoint();
return Long.compare(l1, l2);
}
}
现在您可以使用此比较器对整数进行排序:
Collections.sort(numbers, new ParticipantIndexComparator(participants));
但在此之前,请问问自己为什么您的列表包含Integer
- 作为参与者列表索引的对象,而不是Participant
本身的对象!
答案 2 :(得分:2)
对我来说,这听起来像是半完成SQL查询的解决方案。如果您的数据驻留在数据库中(并且我非常确定是这种情况),请修改SQL查询,以便您不必在应用程序级别对数据进行排序。这有利于至少两个原因:
答案 3 :(得分:0)
您可以使用Comparator根据比赛持续时间对列表进行排序,也可以在Java中使用for-each循环。