如何在 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);
}
}
}
我有这种格式的日期:
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);
}
}
}