英文:
Edit value of a map entry without replace whole map entry
问题
我目前正在寻找一种类似于Map的数据结构,但不同之处在于map条目的值是可编辑的。
我的map看起来像这样:Map<String, List<String>>
。但是在代码中,有时我想向map条目的列表中添加一个项目。但这行不通,因为我认为我不能在不用replace
或put
替换整个条目的情况下编辑map条目的值。
是否有一种类似的数据结构,外观与Map类似,但我可以编辑条目的值?
代码:
for(String p : paths){
String[] arr = p.split("\\\\", 2);
//注意:如果p只有一个元素并且没有File.seperator该怎么办?
List<String> list = geteilt.get(arr[0]);
if(list != null){
if(arr.length > 1){
//这是我的问题。我想将一个String添加到列表中
list.add(arr[1]);
}
} else {
if(arr.length > 1){
geteilt.put(arr[0], List.of(arr[1]));
} else {
geteilt.put(arr[0], List.of());
}
}
}
英文:
I am currently searching for some DataStrucutre that is similar to a Map, but with the diffrenece, that the value of a mapentry is editable.
My map looks like this: Map<String, List<String>>
. But sometimes in the code I want to add an item to the list of a map entry. But this doesn't work, because I think I can't edit a value of a map entry without replacing the whole entry with replace
or put
.
Is there some similar DataStructure that looks similar as Map but I can edit the value of an entry?
Code:
for(String p : paths){
String[] arr = p.split("\\\\", 2);
//achtung was tun wen p nur ein element nur mehr ist und keine File.seperator besitzt???
List<String> list = geteilt.get(arr[0]);
if(list != null){
if(arr.length > 1){
//Here is my problem. I want to add a String to the list
list.add(arr[1]);
}
} else {
if(arr.length > 1){
geteilt.put(arr[0], List.of(arr[1]));
} else {
geteilt.put(arr[0], List.of());
}
}
}
答案1
得分: 1
我认为我不能在不用
replace
或put
替换整个条目的情况下编辑映射条目的值。
这是不正确的。以下是一个示例来证明这一点:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, List<String>> map = Map.of("abc", new ArrayList<>(Arrays.asList("a", "b")), "xyz",
new ArrayList<>(Arrays.asList("x", "y", "z")));
System.out.println("原始: " + map);
map.get("abc").set(1, "c");
map.get("abc").add("p");
System.out.println("更新后: " + map);
}
}
输出:
原始: {xyz=[x, y, z], abc=[a, b]}
更新后: {xyz=[x, y, z], abc=[a, c, p]}
英文:
> I think I can't edit a value of a map entry without replacing the
> whole entry with replace
or put
.
This is not correct. Given below is an example to prove this:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, List<String>> map = Map.of("abc", new ArrayList<>(Arrays.asList("a", "b")), "xyz",
new ArrayList<>(Arrays.asList("x", "y", "z")));
System.out.println("Original: " + map);
map.get("abc").set(1, "c");
map.get("abc").add("p");
System.out.println("Updated: " + map);
}
}
Output:
Original: {xyz=[x, y, z], abc=[a, b]}
Updated: {xyz=[x, y, z], abc=[a, c, p]}
答案2
得分: 0
你不需要为你的情况专门使用新的数据结构,即 Map<String, List
要编辑 Map 中的条目:
-
获取你想要修改的键的值。
-
返回的值将是 List
,你可以使用通常的列表方法修改这个值,改变将会在 Map 的值中反映出来,因为 Map 的值只是对该列表的引用。
英文:
You don't need any new data structure specifically for your case i.e. Map < String, List < String> >
To edit entry of Map:
-
Get the value for a key that you want to modify.
-
The returned value will be List<String> you can modify this value by using the usual list method, and the change will be reflected as Map values are just referenced to the List.
答案3
得分: 0
如果您使用的是Java 8或更高版本,您可以使用compute
或computeIfPresent
。
例如:
Map<String, List<String>> test = new HashMap<>();
test.put("1", Arrays.asList("a", "b", "c"));
test.put("2", Arrays.asList("a", "b", "c"));
System.out.println(test); // 输出 {1=[a, b, c], 2=[a, b, c]}
test.computeIfPresent("1", (k, v) -> {
v.set(2, "changed");
return v;
});
System.out.println(test); // 输出 {1=[a, b, changed], 2=[a, b, c]}
如果您使用的是任何旧版本的Java,我的建议是使用一个工具方法。
英文:
If you are using java 8 or above, you can use compute
or computeIfPresent
.
For instance:
Map<String, List<String>> test = new HashMap<>();
test.put("1", Arrays.asList("a", "b", "c"));
test.put("2", Arrays.asList("a", "b", "c"));
System.out.println(test); // prints {1=[a, b, c], 2=[a, b, c]}
test.computeIfPresent("1", (k, v) -> {
v.set(2, "changed");
return v;
});
System.out.println(test); // prints {1=[a, b, changed], 2=[a, b, c]}
If you are using any older version of java my suggestion is an util method.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论