对于在Java中实现Map.Entry的自定义类别的分类集()的适用性



事情运行得足够平稳,直到我尝试将数据结构记录到控制台,这时我受到了这只丑陋的野兽的欢迎:

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>
}

尝试了不同的地图,阵列,对等不同变化后,我终于在此构造上安顿下来:

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()作为自定义类的一部分实现吗?怎么做?

可以以其他方式打印数据吗?如果是这样?

如果您有兴趣,那么完整的代码就在这里 - 肯定是非常骇人听闻的 - 这只是一个原型。

您已正确声明mapMap.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);

最新更新