有没有办法像C++一样访问Java地图?
在 C++ 中,以下代码片段有效:
map<string, int> myMap;
string str = "okay";
myMap[str] = 69;
myMap[str]++;
cout<<myMap[str]<<endl;
Run Code Online (Sandbox Code Playgroud)
上面的代码完美运行并在控制台中显示 70。
Java中有类似的东西吗?
是和否。
是的,显然您可以在 Java 代码中获得类似的结果。
不,因为您使用的许多概念并不像那样存在,因此 Java 代码看起来会大不相同。
在微不足道的层面上,相当于map<string,int>
是Map<String, Integer>
。请注意,int
不能在这里使用,因为 Java 泛型不支持原始类型作为类型参数,因此您需要使用包装器。在代码中,由于自动装箱,这种差异几乎是不可见的。
但是Map
是一个接口,因此您需要指定要使用的实现。HashMap
是默认选择,如果您没有特定要求。
Map<String, Integer> myMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
Java 没有(自定义)运算符重载,因此您需要调用.put()
以向地图添加值:
String str = "okay";
myMap.put(str, 69); // nice
Run Code Online (Sandbox Code Playgroud)
并且由于同样的问题并且由于Integer
对象是不可变的,以下行在 Java 中看起来有点难看:
myMap.put(str, myMap.get(str) + 1);
Run Code Online (Sandbox Code Playgroud)
打印就是这样:
System.out.println(myMap.get(str));
Run Code Online (Sandbox Code Playgroud)
compute
一种替代方法(即我个人觉得大材小用)是使用compute
方法和lambda表达式这样的(有也computeIfPresent
和computeIfAbsent
与obviuos限制):
myMap.compute(str, (k, v) -> v+1);
Run Code Online (Sandbox Code Playgroud)
AtomicInteger
(或int[]
) 代替Integer
另一种选择是使用类似的东西AtomicInteger
作为你的价值。在这种情况下,您不会真正关心AtomicInteger
具有原子操作的事实,而是Integer
在某种程度上将其用作“可变”。
Map<String, AtomicInteger> myMap = new HashMap<>();
String str = "okay";
myMap.put(str, new AtomicInteger(69));
myMap.get(str).incrementAndGet();
Run Code Online (Sandbox Code Playgroud)
由于AtomicInteger
是可变的,您不必更改映射来更改它指向的值。有些人使用单元素数组(如new int[1]
)来获得类似的效果。我认为这两种用法都有点hacky,个人更喜欢更明确的AtomicInteger
:
Map<String, int[]> myMap = new HashMap<>();
String str = "okay";
myMap.put(str, new int[] { 69 });
myMap.get(str)[0]++;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
78 次 |
最近记录: |