我有一个从迭代中创建的arraylist
,
将会有许多具有相同身份的实例,具有不同的时间,纬度,经度,点数和距离。因此,我想将arraylist ulplist分解为各种子列表。然后,我想按时间对这些子列表进行排序/排序。在按时间对子列表进行排序后,我想执行一些计算,然后将它们连接起来并将结果输出到.csv文件中。
我只需要知道如何将arraylist分解为我想要的这些子列表(这将是暂时的)然后如何根据时间排序它们,这是在第一个[[04ae46c177169feac5f697eexxxx,1418601075,1.375579,103.960797,null, 1000.0]]
[[04ae46c177169feac5f697eexxxx,1418602016,1.381164,103.966164,null, 1000.0]]
[[04ae46c177169feac5f697eexxxx,1418603148,1.381164,103.966164,null, 1000.0]]
[[04ae46c177169feac5f697eexxxx,1418601994,1.381164,103.966164,null, 1000.0]]
[[055ee328d4d297500e9a7f4cffe6xxxx,1418602721,1.313564,103.878443,null, 1000.0]]
[[055ee328d4d297500e9a7f4cffe6xxxx,1418602119,1.313564,103.878443,null, 1000.0]]
[[055ee328d4d297500e9a7f4cffe6xxxx,1418601901,1.313564,103.878443,null, 1000.0]]
[[055ee328d4d297500e9a7f4cffexxxx,1418600991,1.313564,103.878443,null, 1000.0]]
[[055ee328d4d297500e9a7f4cffe6xxxx,1418600132,1.313564,103.878443,null, 1000.0]]
[[00cd34bad39d19f8e2a335b444bxxxx,1418600273,1.345569,103.696973,null, 1000.0]]
[[04036dd2f45253bc9c24810f8e3exxxx,1418603285,1.301047,103.853357,null, 1000.0]]
分隔符之后。
示例输出:
// Reading Grid's row and col size
gridInputValues = Console.ReadLine().Split(' ');
gridRow = int.Parse(gridInputValues[0]);
gridCol = int.Parse(gridInputValues[1]);
gridMatrix2D = new int[gridRow, gridCol];
// Reading Grid's row * col matrix values
for( int r = 0; r < gridRow; r++ )
{
//string[] inputVal = Console.ReadLine().Split('');
//string[] inputVal = Console.ReadLine().Split(string.Empty));
string inputVal = Console.ReadLine();
for( int c = 0; c < gridCol; c++ )
{
//gridMatrix2D[r, c] = int.Parse(inputVal[c]);
gridMatrix2D[r, c] = int.Parse(inputVal[c].ToString());
}
答案 0 :(得分:1)
您可以使用java 8流,例如:
Map<String, List<String>> groups = ulpList.stream().collect(Collectors.groupingBy(e -> e.split(",")[0]));
ArrayList<List<String>> sorted = new ArrayList<>();
for (List<String> s : groups.values()) {
sorted.add(s.stream().sorted((s1, s2) -> {
long ts1 = Long.valueOf(s1.split(",")[1]);
long ts2 = Long.valueOf(s2.split(",")[1]);
return Long.compare(ts1, ts2);
}).collect(Collectors.toList()));
}
// do calculations
// ...
当然你可以将字符串更改为字符串[]以减少分割数量,并将其写得更有效和更优雅,但我想保持简单
答案 1 :(得分:0)
您首先插入然后拆分,为什么不创建包含链表的地图。由于您需要id是唯一的,因此map可以执行此操作,其余的详细信息将存储在列表中。 至于需要基于时间排序,您可以使用比较器。
答案 2 :(得分:0)
您应该将List<String>
转换为Map<String, List<String[]>>
以进行进一步处理。最后,您可以再次加入这些行并将其写入CSV文件。
public Map<String, List<String[]>> groupAndSort(List<String> ulpList) {
Map<String, List<String[]>> grouping = new TreeMap<>();
for (String line : ulpList) {
String[] split = line.split(",");
List<String[]> value = grouping.get(split[0]);
if (value == null) {
value = new ArrayList<>();
grouping.put(split[0], value);
}
value.add(split);
}
for (List<String[]> value : grouping.values()) {
Collections.sort(value, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Long.compare(Long.parseLong(o1[1]), Long.parseLong(o1[2]));
}
});
}
return grouping;
}
public Map<String, List<String[]>> groupAndSort8(List<String> ulpList) {
Map<String, List<String[]>> grouping = ulpList.stream().map(l -> l.split(","))
.collect(Collectors.groupingBy(l -> l[0], TreeMap::new, Collectors.toList()));
grouping.forEach((k, v) -> Collections.sort(v, Comparator.comparingLong(l -> Long.parseLong(l[1]))));
return grouping;
}