【发布时间】:2021-02-04 21:53:11
【问题描述】:
我遇到了问题。我将代码简化为一个小型演示程序。有 1 个名为 Visitor 的类,它看起来像这样:
public class Visitor implements Comparable<Visitor> {
private Integer id;
private String name;
private static int lastIdGiven = 0;
public Visitor(Integer id) {
this.id = id;
}
public Visitor(String name) {
this.id = getNewId();
this.name = name;
}
private int getNewId() {
this.lastIdGiven++;
return this.lastIdGiven;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
@Override
public int compareTo(Visitor o) {
return this.id.compareTo(o.id);
}
}
然后我创建一个List<Visitor> 并为其添加 20 个访问者作为我的示例。我想要的是遍历列表并根据 Id 获取当前访问者下方的 5 个访问者。
这是代码:
public class Main {
public static final int NUM_OF_VISITORS_IN_LIST = 5;
public static void main(String[] args) {
ArrayList<Visitor> visitorList = new ArrayList<>();
for (Integer i = 0; i < 20; i++) {
Visitor visitor = new Visitor("visitor " + i.toString());
visitorList.add(visitor);
}
visitorList.sort(Visitor::compareTo);
for(Visitor visitor : visitorList) {
int visitorSearchId = visitor.getId();
Visitor searchVisitor = new Visitor(visitorSearchId);
int endIndex = Collections.binarySearch(visitorList, searchVisitor);
int startIndex = endIndex - NUM_OF_VISITORS_IN_LIST;
if (startIndex >= 0) {
List<Visitor> foundVisitors = visitorList.subList(startIndex, endIndex);
// REVERSE THE SORTING
//foundVisitors.sort(Visitor::compareTo);
//foundVisitors.sort(Collections.reverseOrder());
System.out.println("For visitor-Id: " + visitor.getId() + ", are the following visitors found:");
for (Visitor foundVisitor : foundVisitors) {
System.out.println("\tId: " + foundVisitor.getId());
}
System.out.println();
}
}
}
}
这是一个访客打印:
For visitor-Id: 19, are the following visitors found:
Id: 14
Id: 15
Id: 16
Id: 17
Id: 18
但现在我想对 5 个 foundVisitor 进行反向排序。为此,我将代码注释掉了,但我有以下几行:
foundVisitors.sort(Visitor::compareTo);
foundVisitors.sort(Collections.reverseOrder());
但是,这导致我得到了一个非常奇怪的列表,它从原始列表中获取旧数据:
For visitor-Id: 19, are the following visitors found:
Id: 18
Id: 4
Id: 3
Id: 2
Id: 1
我以为我会得到以下输出:
For visitor-Id: 19, are the following visitors found:
Id: 18
Id: 17
Id: 16
Id: 15
Id: 14
这里给出的代码是我的整个项目,所以你们都可以复制它:)
出了什么问题,我该如何解决?
【问题讨论】:
标签: java sorting arraylist collections