簡體   English   中英

entrySet()對於在Java中實現Map.Entry的自定義類的適用性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM