有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);

共 (2) 个答案

  1. # 1 楼答案

    在这里:

    dosages = new ArrayList<DosageData>();
    

    您可以为已创建的DosageData对象创建一个新列表。所以当你要排序的列表。。。只包含一个元素(因为您将所有以前的DosageData对象放在单独的列表中,然后将这些列表丢弃)

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

    除此之外,您的代码还有很多地方是错误的:

    • 首先:以合理的方式格式化/缩进。凌乱的代码使您很容易忽略bug
    • 不要使用3种不同的方法来迭代列表。迭代此类集合的直接方法是使用foreach,如:for(Treatment treatment : list) { ...。不需要为循环使用手册,也不需要使用迭代器
    • 比较器必须知道时间戳的格式,这是一个非常糟糕的想法

    导致:请记住compare()方法可能会被调用多次。现在请注意,这个方法正在创建一个数据格式化程序,并对两个日期进行解析。每次和任何时候它都会被调用。当你的列表中有100或1000个条目时,这不是问题。但是如果您谈论的是100K列表元素,那么您在compare()中所做的任何事情都会影响性能。因此,当你处理大列表时,考虑让你的类实现^ {< CD4}}接口,并在对象创建时只计算一次TimeRAPP,以避免重复格式化和解析。

    换句话说:如果DosageData对象已经包含一个真实的日期对象,而不是other代码必须不断解析/格式化字符串,那么您的设计将更加简洁。所有这些代码都需要知道使用什么格式。那是个坏主意

    最后:是2019年。了解用Java8添加的精彩的新日期/时间类!您可能还想了解流,因为您的整个初始代码都可以写成

    private List<DosageData> dosages = list.stream()
      .map(t -> new DosageData(t))
      .collect(Collectors.asList());
    

    就这样

  2. # 2 楼答案

    您正在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知道这一点

    解决方案:在for循环之前创建ArrayList