[英]Suitability of entrySet() for a self-defined class that implements Map.Entry in Java
事情進展得很順利,直到我嘗試將數據結構記錄到控制台上,這時我被這個丑陋的野獸招呼了:
OpcodeCount.java:115: error: cannot find symbol
for (Map.Entry<String, Integer> entry : map.entrySet()) {
^
symbol: method entrySet()
location: variable map of type Entry<String,Integer>
1 error
我正在使用的數據看起來( 或多或少 )是這樣的:
group 1: makePush
group 2:
group 3: 2722
group 1: makePush
group 2:
group 3: 495
group 1: makePush
group 2:
group 3: 495
group 1: opAdd
group 2:
group 3: 10756
group 1: opAdd
group 2:
group 3: 361
但是,這對於我的目的而言還不夠,我需要使其看起來更像這樣,本質上是一個元組列表:
{
<makePush, 2722>,
<makePush, 495>,
<makePush, 495>,
<opAdd, 10756>,
<opAdd, 361>
}
在嘗試了Maps,ArrayLists,Pairs等的不同變體之后,我終於選擇了此構造:
final static class MyEntry<K, V> implements Map.Entry<K, V> {
private final K key;
private V value;
public MyEntry(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public V setValue(V value) {
V old = this.value;
this.value = value;
return old;
}
}
它在以下代碼中實例化:
// output data struct
ArrayList<Entry<String,Integer>> pairList= new ArrayList<>();
像這樣填充:
//Entry<String,Integer> pair1 = new SimpleEntry<>(groupOne, groupThree);
Map.Entry<String, Integer> pair1 = new MyEntry<String, Integer>(groupOne, Integer.valueOf(groupThree));
//Entry<String,Integer> pair1=new Entry<>(groupOne, groupThree);
pairList.add(pair1);
現在,一切進行得很順利,直到我不得不打印為止,這就是我嘗試打印的方式:
Iterator<Map.Entry<String, Integer>> it = pairList.iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> map = it.next(); //so here you don't need a potentially unsafe cast
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
再次出現錯誤,我被此錯誤擊中:
OpcodeCount.java:115: error: cannot find symbol
for (Map.Entry<String, Integer> entry : map.entrySet()) {
^
symbol: method entrySet()
location: variable map of type Entry<String,Integer>
1 error
我是否應該嘗試將entrySet()
作為該自定義類的一部分實現? 怎么做?
是否可以通過其他方式打印數據? 如果可以,怎么辦?
如果您有興趣,請在此處查看完整代碼-誠然非常hacky-它只是一個原型。
您已正確將map
聲明為Map.Entry
。 正如您在實現Map.Entry
接口時所看到的,它沒有entrySet()
方法。 那是在Map
上定義的,但是簡單地命名您的入口map
並不會在該對象上賦予Map
接口,並且這也毫無關系。
無需調用entrySet()
; 您的pairList
實際上是條目集。 只是迭代一下:
List<Map.Entry<String,Integer>> pairList = new ArrayList<>();
pairList.add(new AbstractMap.SimpleEntry<>("x", 0));
...
pairList.forEach(System.out::println);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.