如何将Python字典对象转换为Java等效对象?

7 投票
3 回答
9412 浏览
提问于 2025-04-15 12:37

我需要把一段Python代码转换成等效的Java代码。Python让开发者的生活变得很简单,因为它提供了很多快捷的功能。但是现在我需要把这些代码迁移到Java。我在想,Java中有什么东西可以和Python的字典(dict)对象相对应呢?我试过使用HashMap,但感觉真是太麻烦了。首先考虑这个,

#  Nodes is a dictionary -> Key : (Name, Strength)
for node, (name, strength) in nodes.items():
    nodes[node] = (name, new_strength)

那么我该如何把这个转换成Java呢?一开始我使用了HashMap对象,所以,

Map<Integer, List> nodesMap = new HashMap<Integer,List>();
/* For iterating over the map */
Iterator updateNodeStrengthIterator = nodesMap.entrySet().iterator(); 
while(updateNodeStrengthIterator.hasNext()){ }    

我遇到的问题是如何处理包含名称和强度的列表部分,然后更新强度的部分。有没有什么可行的方法来做到这一点?我应该考虑使用其他的数据结构吗?请帮帮我。

3 个回答

1

Java没有内置的元组(tuple)这种数据结构。你需要自己创建一个类,把这两个东西放在一起,才能模拟出元组的效果。

3

其实你可以试试 jython。下面是来自 这篇文章 的一些内容,它很好地对比了 Python 和 Java。

Jython 中的集合类和 Java 的集合类相比,更加紧密地融入了语言的核心部分,这样可以让代码写得更简洁,功能也更强大。比如,看看下面的 Java 代码:

map = new HashMap();
map.put("one",new Integer(1));
map.put("two",new Integer(2));
map.put("three",new Integer(3));

System.out.println(map.get("one"));

list = new LinkedList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(3));

再看看 Jython 的代码:

map = {"one":1,"two":2,"three":3}
print map ["one"]
list = [1, 2, 3]


编辑:用 put() 来替换值有什么问题呢?

map.put(key,new_value);

这里有一个简单的示例程序:

static public void main(String[] args){
    HashMap<String,Integer> map = new HashMap<String,Integer>();
     //name, age
    map.put("billy", 21);
    map.put("bobby", 19);
    year(map);
    for(String i: map.keySet()){
        System.out.println(i+ " " + map.get(i).toString());
    }
}
// a year has passed
static void year(HashMap<String,Integer> m){
    for(String k: m.keySet()){
        m.put(k, m.get(k)+1);
    }
}
4

最简单的方法可能就是为(Name, Strength)这个组合创建一个类:

class NameStrength {
    public String name;
    public String strength;
}

如果需要的话,可以添加获取器、设置器和构造函数。

然后你就可以在你的映射中使用这个新类:

Map<Integer, NameStrength> nodesMap = new HashMap<Integer, NameStrength>();

在Java 5及以上版本中,你可以这样遍历:

for (NameStrength nameStrength : nodesMap.values()) {}

或者这样遍历:

for (Entry<Integer, NameStrength> entry : nodesMap.entrySet()) {}

撰写回答