没有调用/执行Collections.sort(),即不只输入此方法

时间:2019-06-16 06:04:22

标签: java sorting collections

我正在使用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);

2 个答案:

答案 0 :(得分:3)

这里:

dosages = new ArrayList<DosageData>();

您创建的新列表每个 DosageData对象。因此,当您要排序的列表中仅包含一个元素时(因为您将所有先前的DosageData对象放入了单独的列表中,然后将这些列表丢弃了。

可以对具有一个条目的列表进行排序,而无需调用比较器的任何方法。

除此之外,您的代码还有很多真正的问题:

  • 首先:以合理的方式格式化/缩进。凌乱的代码使您轻松忽略错误。
  • 请勿使用3种不同的方法来迭代您的列表。迭代此类集合的直接方法是使用 foreach ,例如: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。