我的日期格式如下:
Key Value
13:00:08 : 3
13:00:08 : 2
13:00:08 : 2
13:00:06 : 2
13:00:08 : 2
13:00:09 : 1
13:00:07 : 2
13:00:09 : 3
我将时间戳转换为秒。然后根据时间戳,我必须对数据进行排序。
我尝试使用TreeMap
,但它删除了重复项。我尝试了HashMap
,但它删除了重复项。 MultiMap
在这里不起作用。
我尝试过的代码是:
Map<Integer, Integer> map = new TreeMap<Integer, Integer>(tmap);
System.out.println("After Sorting:");
Set set2 = map.entrySet();
Iterator iterator2 = set2.iterator();
while(iterator2.hasNext()) {
Map.Entry me2 = (Map.Entry)iterator2.next();
System.out.print(me2.getKey() + ": ");
System.out.println(me2.getValue());
}
如何进行排序?
答案 0 :(得分:3)
听起来像只想要一张清单。
将时间和值封装在一个对象中,并处理这些对象的列表。然后,您可以按时间对列表进行排序。
public class TimeValue {
LocalTime time;
int value;
public TimeValue(LocalTime time, int value) {
this.time = time;
this.value = value;
}
public LocalTime getTime() {
return time;
}
public static void main(String[] args) {
List<TimeValue> timeValues = new ArrayList<>();
timeValues.add(new TimeValue(LocalTime.of(13, 0, 8), 3));
timeValues.add(new TimeValue(LocalTime.of(13, 0, 8), 2));
timeValues.add(new TimeValue(LocalTime.of(13, 0, 8), 2));
timeValues.add(new TimeValue(LocalTime.of(13, 0, 6), 2));
timeValues.add(new TimeValue(LocalTime.of(13, 0, 8), 2));
timeValues.add(new TimeValue(LocalTime.of(13, 0, 9), 1));
timeValues.add(new TimeValue(LocalTime.of(13, 0, 7), 2));
timeValues.add(new TimeValue(LocalTime.of(13, 0, 9), 3));
timeValues.sort(Comparator.comparing(TimeValue::getTime));
System.out.println(timeValues);
}
@Override
public String toString() {
return this.time + ": " + this.value;
}
}
List
比Map
更好的原因是,在您的情况下,时间不是唯一的;因此,它不能用作密钥。
答案 1 :(得分:1)
因此,对于您发布的示例,实际的问题是在代码示例中创建tmap
。差不多就是解析数据。
Map<LocalTime, List<Integer>> result = new TreeMap<>();
try (Scanner fileScanner = new Scanner(yourFile)) {
while (fileScanner.hasNext()) {
try (Scanner lineScanner = new lineScanner(fileScanner.nextLine())) {
LocalTime time = DateTimeFormatter.ISO_LOCAL_TIME.parse(lineScanner.next());
// skip the ":"
lineScanner.next();
int value = lineScanner.nextInt();
// use the list for this time or create a new one if none is present
List<Integer> valueList = result.computeIfAbsent(time, d -> new ArrayList<>());
valueList.add(value);
}
}
}