我正在使用Collections.sort()方法基于时间字段对记录列表进行排序。但是我的程序执行并不仅仅是输入此方法。 我从数据库中获取治疗对象记录的列表,该记录存储在 list 变量中。 我根据一些参数过滤这些记录,并将过滤后的数据存储在DosagaData类型的列表剂量中。 之后,我需要根据时间字段对过滤后的列表进行排序,为此我使用了未被调用的Collections.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);
答案 0 :(得分:3)
这里:
dosages = new ArrayList<DosageData>();
您创建的新列表每个 DosageData对象。因此,当您要排序的列表中仅包含一个元素时(因为您将所有先前的DosageData对象放入了单独的列表中,然后将这些列表丢弃了。
可以对具有一个条目的列表进行排序,而无需调用比较器的任何方法。
除此之外,您的代码还有很多真正的问题:
for(Treatment treatment : list) { ...
。无需使用手动for循环,无需使用迭代器!要注意:请记住,您的compare()
方法可能被称为很多次。现在请注意,此方法正在创建一个数据格式化程序,并且会解析两个日期。每次调用它。当您说列表中有100或1000个条目时,这不是问题。但是,如果您要谈论的是100K列表元素,那么您在compare()
中所做的任何事情都会对性能产生影响。因此:在处理大型列表时,请考虑让类实现Comparable
接口,并在对象创建时仅计算一次该时间戳,以避免重复的格式化和解析。
换句话说:如果DosageData对象已经包含一个实际的Date对象,而不是必须不断解析/格式化字符串的 other 代码,则您的设计将更加简洁。所有这些代码都需要知道使用哪种格式。那是个坏主意!
最后:是2019年。了解Java 8新增的精彩的Date / Time类!您可能还想了解流,因为整个初始代码都可以写为
private List<DosageData> dosages = list.stream()
.map(t -> new DosageData(t))
.collect(Collectors.asList());
就是这样。
答案 1 :(得分:1)
您正在for循环中创建一个新的ArrayList:dosages = new ArrayList<DosageData>();
:
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>(); // ***** HERE ******
dosage.dosageTime = time;
System.out.println("DosageData time is " + dosage.dosageTime);
this.dosages.add(dosage);
this.dosageCount += 1;
}
}
,因此此列表将仅包含一个DosageData项目。无需仅对一项内的ArrayList进行排序,而Java知道这一点。
解决方案:在循环之前创建ArrayList。