【问题标题】:Converting Python into Java and facing some issues将 Python 转换为 Java 并面临一些问题
【发布时间】:2013-05-03 11:55:23
【问题描述】:

我正在将以下 Python 代码转换为 Java 代码,如下所示:

import random
howMany = random.randint(0,1000)
stats = {}
for i in range(howMany):
value = random.randint(0,500)
stats.setdefault(value,0)
stats[value]+=1
for item in stats:
if stats[item] > 1:
    print item

这是我目前编写的 Java 代码:

import java.util.Random;
import java.util.*;

public class PythonToJava 
{
    public static void main(String[] args) 
    {
        Random rm = new Random();
        int i = rm.nextInt(1000);
        HashMap<Integer,Integer> stats = new HashMap<Integer,Integer>();
        System.out.println("Random Number Generated is: " + i);
        for (int j = 0; j<i; j++)
        {
            int value = rm.nextInt(500);
            System.out.println("The value of VALUE is " + value);
            DefaultingMap<Integer,Integer> defaultvalue = new DefaultingMap<Integer,Integer>();
            defaultvalue.put(value,0);
        }
    }
}

public class DefaultingMap<Integer, Integer> implements Map<Integer, Integer>
{
    private final Map<Integer, Integer> map;
    private final Integer defaultValue;
    public DefaultingMap(Map<Integer, Integer> map, Integer defaultValue)
    {
        this.map = map;
        this.defaultValue = defaultValue;
    }

    @Override public Integer get(Object key)
    {
        Integer ret = map.get(key);
        if (ret == null)
        {
            ret = defaultValue;
        }
        return ret;
    }

    @Override public int size()
    {
        return map.size();
    }
    // etc
}

但在以下行出现错误:

Java 代码:

DefaultingMap&lt;Integer,Integer&gt; defaultvalue = new DefaultingMap&lt;Integer,Integer&gt;(); 错误是:构造函数 DefaultingMap() 未定义

public class DefaultingMap&lt;Integer, Integer&gt; implements Map&lt;Integer, Integer&gt;

Error is : Multiple markers at this line
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.remove(Object)
    - The type parameter Integer is hiding the type Integer
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.put(Integer, Integer)
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.keySet()
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.values()
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.containsKey(Object)
    - The type parameter Integer is hiding the type Integer
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.containsValue(Object)
    - Duplicate type parameter Integer
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.entrySet()
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.putAll(Map<? extends Integer,? extends Integer>)
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.isEmpty()
    - The type DefaultingMap<Integer,Integer> must implement the inherited abstract method 
     Map<Integer,Integer>.clear()

谁能解释一下原因?

基本上,我正在尝试以某种方式设置默认值,就像 setdefault 在 python 中的工作方式一样。如果有人可以在这里帮助我,我将不胜感激。

【问题讨论】:

  • 错误说明了什么?
  • DefaultingMap 似乎不是标准 JDK 的一部分。您可能需要添加额外的库或直接使用其他类。
  • DefaultingMap 是否与 PythonToJava 在同一个文件中?您不能在同一个文件中定义两个公共类。
  • 查看@asif 的答案。
  • 另请注意,Python 的randint(0,1000) 等同于Java nextInt(1001),与500 相同。Java 的范围是排他性的,Pythons 是包容性的。

标签: java python hashmap


【解决方案1】:

我修改了

DefaultingMap<Integer,Integer> defaultvalue = new DefaultingMap<Integer,Integer>();

DefaultingMap<Integer,Integer> defaultvalue = new DefaultingMap<Integer,Integer>(new HashMap<Integer, Integer>(),0);

还有

public class DefaultingMap<Integer, Integer> implements Map<Integer, Integer>
{
    private final Map<Integer, Integer> map;
    private final Integer defaultValue;

    public DefaultingMap(Map<Integer, Integer> map, Integer defaultValue)
    {
        this.map = map;
        this.defaultValue = defaultValue;
    }

    @Override public Integer get(Object key)
    {
        Integer ret = map.get(key);
        if (ret == null)
        {
            ret = defaultValue;
        }
        return ret;
    }

成为

class DefaultingMap<K, V> implements Map<K,V>{ //remove public and use proper generic parameters

   private final Map<K, V> map; // is now generic
   private final V defaultValue; // must be of type V

   public DefaultingMap(Map<K, V> map, V defaultValue) throws IllegalArgumentException
   {
   /* because we have defined this constructor DefaultingMap() will need to be 
      defined if we need/want it. */
       if (map == null){
           throw new IllegalArgumentException("provided map cannot be null");
       }
       this.map = map;
       this.defaultValue = defaultValue;
   }

   public V get(Object key){

       V ret = map.get(key);
       if (ret == null){
           ret = defaultValue;
       }
       return ret;
   }

如果您不确定,您需要实现 Map 接口中的所有方法

   @Override
   public V put(K key, V value) {
       return map.put(key,value); // delegate to map
   }

这对我有用。

【讨论】:

  • 嗨@BevynQ,感谢您的回答。您能否更新您的代码以扩展类 HashMap ?我更喜欢扩展一个类而不是覆盖接口的所有方法。
【解决方案2】:

我看到的是您在DefaultingMap 中有参数化构造函数,并且缺少默认构造函数。请添加默认构造函数

public DefaultingMap()
{
  // do your things
}

否则改变这个调用

DefaultingMap<Integer,Integer> defaultvalue = new DefaultingMap<Integer,Integer>();
defaultvalue.put(value,0);

到这里

DefaultingMap<Integer,Integer> defaultvalue = new DefaultingMap<Integer,Integer>(value,0);

更新
很明显,您需要覆盖刚刚覆盖的 MAP 中的所有方法。请覆盖所有方法。那么这将解决您的问题
以下方法覆盖

remove
put
keySet
values
containsKey
containsValue
entrySet
putAll
isEmpty

请参阅Method Summary Section 以查看要覆盖的方法

建议 如果您不想覆盖 MAP 中的所有方法(因为这真的很痛苦),那么您可以使用implements MAP 而不是extends HashMap。有了这个,你只需要覆盖你想要的方法。如您的情况 getsize

【讨论】:

  • 提及public DefaultingMap() { // do your things } 确实有效,但第二个错误仍然存​​在,即“此行有多个标记。
  • 你能告诉我们其他错误是什么吗?首先,将class 分成不同的文件(因为每个文件只允许一个公共类)
  • 很明显,您需要覆盖您刚刚覆盖的MAP 中的所有方法。请覆盖所有方法。那么这将解决您的问题
  • 不确定我需要再次覆盖哪些方法。你能在这里提一下吗?
  • 感谢您的回答,我宁愿在此处扩展HashMap,之后也没有任何改变。可能是什么原因?这是我更改的内容:class DefaultingMap&lt;Integer, Integer&gt; extends HashMap&lt;Integer, Integer&gt;
猜你喜欢
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多