如何在 Java 中按键排序?

How to sort by key in Java?

我有这种格式的日期:

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

如何进行排序?

听起来你只是想要一个列表。

将时间和值封装在一个对象中,并处理这些对象的列表。然后您可以按时间对列表进行排序。

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 的原因是在您的情况下时间不是唯一的;因此不能用作密钥。

因此对于您发布的示例,实际问题是在您的代码示例中创建 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);
        }
    }
}