Java 将表转换为列表<;地图<;字符串,字符串>&燃气轮机;以第一列的值为条件
编辑:我现在只限于Java8 我有一个表,它总是有3列:id | key | value 我可以很容易地将此表设置为Java 将表转换为列表<;地图<;字符串,字符串>&燃气轮机;以第一列的值为条件,java,string,list,Java,String,List,编辑:我现在只限于Java8 我有一个表,它总是有3列:id | key | value 我可以很容易地将此表设置为列表格式(每行都是字符串列表)或列表格式(列表中的所有表值)。 但我的实际目标是一个列表(或映射参见示例),其中映射包含表的键值对,每个列表包含表的相同给定id的所有键值对 例如下表 | ID | KEY | VALUE | |---- |----- |------- | | 1 | A | X | | 1 |
列表
格式(每行都是字符串列表)或列表
格式(列表中的所有表值)。
但我的实际目标是一个列表
(或映射
参见示例),其中映射包含表的键值对,每个列表包含表的相同给定id的所有键值对
例如下表
| ID | KEY | VALUE |
|---- |----- |------- |
| 1 | A | X |
| 1 | B | Y |
| 2 | C | Z |
| 3 | D | BLA |
应该变成
{
((A=X),(B=Y)),
((C=Z)),
((D=BLA)),
}
ID列仅用于分组
ID可以是从数字到字母数字的任何内容
我想出了一些有效的方法,但它很丑陋,也许有一种方法可以做得更好,更可读,也许可以使用流
List<List<String>> myTable = something;
Map<String, Map<String, String>> outerMap = new HashMap<>();
Map<String, String> innerMap = new HashMap<>();
for (List<String> s: myTable ) {
if (!outerMap.containsKey(s.get(0))) {
innerMap.clear();
}
innerMap.put(s.get(1), s.get(2));
outerMap.put(s.get(0), new HashMap<>(innerMap));
}
List myTable=something;
Map outerMap=newhashmap();
Map innerMap=新的HashMap();
对于(列表s:myTable){
如果(!outerMap.containsKey(s.get(0))){
clear();
}
put(s.get(1),s.get(2));
outerMap.put(s.get(0),newhashMap(innerMap));
}
请注意,我创建HashMap时经常使用outerMap方式。使用流API::forEach,如下所示 注意:
Map.of()
来自JDK-9+
myTable.forEach(row -> {
outerMap.put(row.get(0), new HashMap<>(Map.of(row.get(1), row.get(2))));
});
myTable.forEach(行->{
outerMap.put(row.get(0),newhashmap(Map.of(row.get(1),row.get(2));
});
通过像这样使用流API::forEach
注意:Map.of()
来自JDK-9+
myTable.forEach(row -> {
outerMap.put(row.get(0), new HashMap<>(Map.of(row.get(1), row.get(2))));
});
myTable.forEach(行->{
outerMap.put(row.get(0),newhashmap(Map.of(row.get(1),row.get(2));
});
您可以为此使用流API
首先是外部映射的groupingBy
ID,然后是内部映射的toMap
by键值
Map<String, Map<String, String>> res = myTable.stream()
.collect(Collectors.groupingBy(e -> e.get(0),
Collectors.toMap(f -> f.get(1),g -> g.get(2))));
Map res=myTable.stream()
.collect(收集器.groupingBy(e->e.get)(0),
toMap(f->f.get(1),g->g.get(2));
并获取外部映射的唯一值
List<Map<String, String>> list = new ArrayList<>(res.values());
List List=newarraylist(res.values());
您可以为此使用流API
首先是外部映射的groupingBy
ID,然后是内部映射的toMap
by键值
Map<String, Map<String, String>> res = myTable.stream()
.collect(Collectors.groupingBy(e -> e.get(0),
Collectors.toMap(f -> f.get(1),g -> g.get(2))));
Map res=myTable.stream()
.collect(收集器.groupingBy(e->e.get)(0),
toMap(f->f.get(1),g->g.get(2));
并获取外部映射的唯一值
List<Map<String, String>> list = new ArrayList<>(res.values());
List List=newarraylist(res.values());
这不像使用流那样优雅,但可能更容易理解:
public static void main(String[] args) {
List<List<String>> myTable = Arrays.asList(Arrays.asList("1", "A", "X"), Arrays.asList("1", "B", "Y"),
Arrays.asList("2", "C", "Z"), Arrays.asList("3", "D", "BLA"));
Map<String, Map<String, String>> result = new HashMap<>();
for (List<String> row : myTable) {
String id = row.get(0);
Map<String, String> map = result.get(id);
if (map == null) {
Map<String, String> entry = new HashMap<>();
entry.put(row.get(1), row.get(2));
result.put(id, entry);
} else
map.put(row.get(1), row.get(2));
}
}
publicstaticvoidmain(字符串[]args){
List myTable=Arrays.asList(Arrays.asList(“1”、“A”、“X”)、Arrays.asList(“1”、“B”、“Y”),
Arrays.asList(“2”、“C”、“Z”)、Arrays.asList(“3”、“D”、“BLA”);
映射结果=新的HashMap();
对于(列表行:myTable){
String id=row.get(0);
Map=result.get(id);
if(map==null){
Map entry=newhashmap();
entry.put(row.get(1),row.get(2));
结果.输入(id,条目);
}否则
map.put(row.get(1),row.get(2));
}
}
这不像使用流那样优雅,但可能更容易理解:
public static void main(String[] args) {
List<List<String>> myTable = Arrays.asList(Arrays.asList("1", "A", "X"), Arrays.asList("1", "B", "Y"),
Arrays.asList("2", "C", "Z"), Arrays.asList("3", "D", "BLA"));
Map<String, Map<String, String>> result = new HashMap<>();
for (List<String> row : myTable) {
String id = row.get(0);
Map<String, String> map = result.get(id);
if (map == null) {
Map<String, String> entry = new HashMap<>();
entry.put(row.get(1), row.get(2));
result.put(id, entry);
} else
map.put(row.get(1), row.get(2));
}
}
publicstaticvoidmain(字符串[]args){
List myTable=Arrays.asList(Arrays.asList(“1”、“A”、“X”)、Arrays.asList(“1”、“B”、“Y”),
Arrays.asList(“2”、“C”、“Z”)、Arrays.asList(“3”、“D”、“BLA”);
映射结果=新的HashMap();
对于(列表行:myTable){
String id=row.get(0);
Map=result.get(id);
if(map==null){
Map entry=newhashmap();
entry.put(row.get(1),row.get(2));
结果.输入(id,条目);
}否则
map.put(row.get(1),row.get(2));
}
}
您的输入数据在列表中到底是什么样子的?为什么这很重要?真的可以是任何东西我不明白这个列表是如何存储你给我们看的表格的。例如,它是否包含3个列表,所有列表都包含键和值作为单独的元素?像这样:[[“A”、“X”、“B”、“Y”]、[“C”、“Z”]、[“D”、“BLA”]]
?表中的每一行都是一个列表,然后是一个列表,其中包含此列表您的输入数据在该列表中看起来像什么?为什么这很重要?真的可以是任何东西我不明白这个列表是如何存储你给我们看的表格的。例如,它是否包含3个列表,所有列表都包含键和值作为单独的元素?所以像这样:[[“A”、“X”、“B”、“Y”]、[“C”、“Z”]、[“D”、“BLA”]]
?表中的每一行都是一个列表,然后是一个列表,其中包含这个列表谢谢,我明天会尝试这个。我在理解流api时遇到了问题,即使我现在已经读了一些关于它的文章。什么是一个好的方法,学习自己写这些东西?这很有效。谢谢如果我想在分组后扔掉id,将我的地图放在列表中,我该怎么做?@Krwasch更简单的方法是调用res.values()
并创建一个列表,查看更新的答案。@Krwasch有很多在线资源可用,请尝试开始。谢谢,我明天会尝试。我在理解流api时遇到了问题,即使我现在已经读了一些关于它的文章。什么是一个好的方法,学习自己写这些东西?这很有效。谢谢如果我想在分组后扔掉id并将我的地图放在列表中,我该怎么做?@Krwasch更简单的方法是调用res.values()
并创建一个列表,查看更新的答案。@Krwasch有很多在线资源可用,请尝试开始。