Java 如何对向量进行排序<;向量<;字符串>&燃气轮机;在多个元素上保持子项分组在一起?
因此,我从RESTAPI返回JSON数据,其中数据已经由日期字段排序,然后添加到JTable中使用的向量>。我需要将具有相同5位密钥的项目分组在一起,然后根据附加标识符desc order(3,2,1)对这些项目进行排序,其中date决定下一个5位密钥 例如:Java 如何对向量进行排序<;向量<;字符串>&燃气轮机;在多个元素上保持子项分组在一起?,java,arrays,sorting,vector,Java,Arrays,Sorting,Vector,因此,我从RESTAPI返回JSON数据,其中数据已经由日期字段排序,然后添加到JTable中使用的向量>。我需要将具有相同5位密钥的项目分组在一起,然后根据附加标识符desc order(3,2,1)对这些项目进行排序,其中date决定下一个5位密钥 例如: [[28696, 2, 11/15/19 17:57]] [[28696, 1, 11/15/19 17:56]] [[00972, 2, 11/15/19 17:55]] [[28696, 3, 11/15/19 17:54]] [[0
[[28696, 2, 11/15/19 17:57]]
[[28696, 1, 11/15/19 17:56]]
[[00972, 2, 11/15/19 17:55]]
[[28696, 3, 11/15/19 17:54]]
[[00972, 1, 11/15/19 17:53]]
应该是
[[28696, 3, 11/15/19 17:54]]
[[28696, 2, 11/15/19 17:57]]
[[28696, 1, 11/15/19 17:56]]
[[00972, 2, 11/15/19 17:55]]
[[00972, 1, 11/15/19 17:53]]
请注意,28696是组中的第一个项目,是整个数据集中最新的项目 只需一次
sort
操作就无法实现您想要的。相反,您可以使用流来满足分组、对组进行排序以及对组内的数据进行排序的要求
首先请注意,我将您的列表
转换为列表
(按照Max Vollmer的建议),以便于使用和理解。如果您确实需要它作为列表
,您可以将数据
替换为列表
,将数据.get()
替换为列表.get(?)
:
您想要的不是一个
sort
操作就能实现的。相反,您可以使用流来满足分组、对组进行排序以及对组内的数据进行排序的要求
首先请注意,我将您的列表
转换为列表
(按照Max Vollmer的建议),以便于使用和理解。如果您确实需要它作为列表
,您可以将数据
替换为列表
,将数据.get()
替换为列表.get(?)
:
将其设置为
向量
,并为正确保存此数据的MyClasss创建一个排序函数
。将其设置为向量
,并为正确保存此数据的MyClasss创建一个排序函数。谢谢,这完全符合需要。感谢您提供的详细代码和解释。谢谢,这完全符合需要。感谢您提供详细的代码和解释。
public static void main(String[] args) throws IOException, TransformerException {
List<Data> list = Arrays.asList( //
new Data("28696", "2", "11/15/19 17:57"), //
new Data("28696", "1", "11/15/19 17:56"), //
new Data("00972", "2", "11/15/19 17:55"), //
new Data("28696", "3", "11/15/19 17:54"), //
new Data("00972", "1", "11/15/19 17:53"));
Comparator<Data> sortByTimestamp = Comparator.comparing(Data::getTimestamp).reversed();
Comparator<Data> sortByOccurrence = Comparator.comparing(Data::getOccurrence).reversed();
// LinkedHashMap keeps the insertion order
Collector<Data, ?, LinkedHashMap<String, List<Data>>> groupByIdKeepInsertOrder
= Collectors.groupingBy(Data::getId, LinkedHashMap::new, Collectors.toList());
List<Data> result = list.stream()
.sorted(sortByTimestamp) // sort all data by timestamp, if it's already sorted by timestamp you can skip this
.collect(groupByIdKeepInsertOrder) // group them by id keeping the timestamp order
.values().stream() // stream the lists of data grouped together
.peek(l -> l.sort(sortByOccurrence)) // sort each list of data by occurrence
.flatMap(Collection::stream) // flatten the lists into a single stream
.collect(Collectors.toList()); // collect all Data into a single list
System.out.println(result);
// [[28696, 3, 11/15/19 17:54],
// [28696, 2, 11/15/19 17:57],
// [28696, 1, 11/15/19 17:56],
// [00972, 2, 11/15/19 17:55],
// [00972, 1, 11/15/19 17:53]]
}
private static class Data {
private final String id;
private final String occurrence;
private final String timestamp;
public Data(String id, String occurrence, String timestamp) {
this.id = id;
this.occurrence = occurrence;
this.timestamp = timestamp;
}
public String getId() { return id; }
public String getOccurrence() { return occurrence; }
public String getTimestamp() { return timestamp; }
@Override public String toString() { return "[" + id + ", " + occurrence + ", " + timestamp + "]";}
}