java集合。sort()未被调用/执行,即未仅输入此方法
我在利用收藏品。sort()方法根据时间字段对记录列表进行排序。但我的程序执行并不仅仅是进入这个方法。 我正在从数据库中获取治疗对象记录列表,并将其存储在列表变量中。 我根据一些参数过滤这些记录,并将过滤后的记录存储在DosagaData类型的列表中。 在此之后,我需要根据我使用集合的时间字段对过滤后的列表进行排序。sort()未被调用
'''
private List<TreatmentObject> list;
private List<DosageData> dosages;
for (int i = 0; i < list.size(); i++) {
DosageData dosage = new DosageData(list.get(i));
System.out.println("Dosage data is" + dosage);
if(dosage != null) {
dosages = new ArrayList<DosageData>();
dosage.dosageTime = time;
System.out.println("DosageData time is " + dosage.dosageTime);
this.dosages.add(dosage);
this.dosageCount += 1;
}
}
Iterator<DosageData> dosaegDataIterator = dosages.iterator();
while (dosaegDataIterator.hasNext()) {
System.out.println("Before Sorting " + dosaegDataIterator.next().dosageTime);
}
Collections.sort(dosages, new Comparator<DosageData>() {
@Override
public int compare(DosageData first, DosageData second) {
System.out.println("Inside Dosage Sorter Class");
Date firstDate = null, secondDate = null;
String firstTimes = first.dosageTime;
System.out.println("First time is" + firstTimes);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSSZZZZZ");
try {
firstDate = sdf.parse(firstTimes);
System.out.println("First date is" + firstDate);
} catch (ParseException e) {
e.printStackTrace();
}
String secondTimes = second.dosageTime;
System.out.println("Second time is" + secondTimes);
try {
secondDate = sdf.parse(secondTimes);
System.out.println("Second date is" + secondDate);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("Return result is" + firstDate.compareTo(secondDate));
return firstDate.compareTo(secondDate);
}
});
for (DosageData dosage : dosages) {
System.out.println("After Sorting" + dosage.dosageTime);
}
System.out.println("Sorted Dosages is" +dosages);
# 1 楼答案
在这里:
您可以为已创建的DosageData对象创建一个新列表。所以当你要排序的列表。。。只包含一个元素(因为您将所有以前的DosageData对象放在单独的列表中,然后将这些列表丢弃)
具有一个条目的列表可以排序,而无需调用比较器的任何方法
除此之外,您的代码还有很多地方是错误的:
for(Treatment treatment : list) { ...
。不需要为循环使用手册,也不需要使用迭代器李>导致:请记住
compare()
方法可能会被调用多次。现在请注意,这个方法正在创建一个数据格式化程序,并对两个日期进行解析。每次和任何时候它都会被调用。当你的列表中有100或1000个条目时,这不是问题。但是如果您谈论的是100K列表元素,那么您在compare()
中所做的任何事情都会影响性能。因此,当你处理大列表时,考虑让你的类实现^ {< CD4}}接口,并在对象创建时只计算一次TimeRAPP,以避免重复格式化和解析。换句话说:如果DosageData对象已经包含一个真实的日期对象,而不是other代码必须不断解析/格式化字符串,那么您的设计将更加简洁。所有这些代码都需要知道使用什么格式。那是个坏主意
最后:是2019年。了解用Java8添加的精彩的新日期/时间类!您可能还想了解流,因为您的整个初始代码都可以写成
就这样
# 2 楼答案
您正在for循环中创建一个新的ArrayList:
dosages = new ArrayList<DosageData>();
:所以这个列表只包含一个DosageData项。不需要只在一个项目中对ArrayList进行排序,Java知道这一点
解决方案:在for循环之前创建ArrayList