将Python转换为Java并面临一些问题
我将以下Python代码转换为Java代码,如下所示:将Python转换为Java并面临一些问题,java,python,hashmap,Java,Python,Hashmap,我将以下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 以下是我迄今为止编
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
}
import java.util.Random;
导入java.util.*;
公共类PythonToJava
{
公共静态void main(字符串[]args)
{
随机rm=新随机();
int i=下一次调整令吉(1000);
HashMap stats=newhashmap();
System.out.println(“生成的随机数为:“+i”);
对于(int j=0;j我看到的是您在DefaultingMap
中有参数化构造函数,并且缺少默认构造函数。请添加默认构造函数
public DefaultingMap()
{
// do your things
}
否则,请更改此呼叫
DefaultingMap<Integer,Integer> defaultvalue = new DefaultingMap<Integer,Integer>();
defaultvalue.put(value,0);
请参阅要重写的方法
建议
如果您不希望超越MAP中的所有方法(因为这确实是一件痛苦的事情),那么您可以使用扩展HashMap
,而不是实现MAP
。这样您只需要超越您想要的方法。就像您的情况一样,get和size我修改了
DefaultingMap<Integer,Integer> defaultvalue = new DefaultingMap<Integer,Integer>();
这对我很有用。错误是怎么说的?DefaultingMap似乎不是标准JDK的一部分。您可能需要添加其他库或使用另一个类。DefaultingMap与PythonToJava在同一文件中吗?您不能在同一文件中定义两个公共类。请参阅@asif中的ans。还请注意Python的randint(01000)
等同于JavanextInt(1001)
,与500相同。Java的范围是独占的,Pythons是包含的。提及public DefaultingMap(){//do your things}
确实有效,但第二个错误仍然存在,即“此行有多个标记。您能告诉我们其他错误是什么吗?首先,将类
分为不同的文件(因为每个文件只允许一个公共类)很明显,您需要覆盖MAP
中的所有方法。您刚刚覆盖了少数方法。请覆盖所有方法。然后这将解决您的问题。您不确定我需要再次覆盖哪些方法。请在这里提及它。谢谢您的回答,我宁愿在这里扩展HashMap
,然后再进行扩展t也没有改变。原因可能是什么?以下是我所改变的:class DefaultingMap Extendes HashMap
Hi@BevynQ,谢谢你的回答。你能更新扩展类HashMap的代码吗?我更喜欢扩展类,而不是覆盖接口的所有方法。
DefaultingMap<Integer,Integer> defaultvalue = new DefaultingMap<Integer,Integer>(value,0);
remove
put
keySet
values
containsKey
containsValue
entrySet
putAll
isEmpty
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;
}
@Override
public V put(K key, V value) {
return map.put(key,value); // delegate to map
}