C#难民寻求Java集合的帮助

C#难民寻求Java集合的帮助,java,collections,dictionary,map,Java,Collections,Dictionary,Map,我需要在某种类型的集合中存储键/值信息。在C#中,我将定义一个如下的字典: var entries = new Dictionary<string, int>(); entries.Add("Stop me", 11); entries.Add("Feed me", 12); entries.Add("Walk me", 13); 如何在Java中实现这一点?我已经看到了使用ArrayList的示例,但是如果可能的话,我希望使用泛型的解决方案 看起来您正在寻找类似于您想使用地图 M

我需要在某种类型的集合中存储键/值信息。在C#中,我将定义一个如下的字典:

var entries = new Dictionary<string, int>();
entries.Add("Stop me", 11);
entries.Add("Feed me", 12);
entries.Add("Walk me", 13);

如何在Java中实现这一点?我已经看到了使用
ArrayList
的示例,但是如果可能的话,我希望使用泛型的解决方案

看起来您正在寻找类似于

您想使用
地图

Map<String, Integer> m = new HashMap<String, Integer>();
m.put("Stop me", 11);
Integer i = m.get("Stop me"); // i == 11
这是(Java的自动取消装箱)的缩写:


如果给定键的映射中没有值,
get
返回
null
,此表达式抛出
NullPointerException
。因此,在本例中,使用装箱类型
Integer
总是一个好主意,因为您肯定需要一个
HashMap
,它是Java中使用的C#
字典的Java版本

请注意,您不能将
int
(或任何其他基元类型)用作泛型类型参数,但由于自动装箱,它的行为仍然几乎像是
Map
而不是
Map
。(不过,您不希望在性能敏感的代码中进行大量自动装箱。)

Map entries=newhashmap();
条目。放置(“阻止我”,11);
输入。输入(“喂我”,12);
参赛作品.放上"走我,13";;
int value=entries.get(“停止我”);//如果你知道它的存在
//如果不确定映射是否包含值,则最好执行以下操作:
整数boxedValue=entries.get(“Punch me”);
if(boxedValue!=null){
int unboxedValue=boxedValue;
...
}

使用
java.util.Map
。有几种实现方式:

  • HashMap
    :O(1)查找,不维护键的顺序
  • TreeMap
    :O(logn)查找,维护键的顺序,因此您可以按保证的顺序对键进行迭代
  • LinkedHashMap
    :O(1)查找,按键添加到映射的顺序迭代键
您使用它们的方式如下:

Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Stop me", 11);
map.put("Feed me", 12);

int value = map.get("Stop me");
Map Map=newhashmap();
地图放置(“阻止我”,11);
地图放置(“喂我”,12);
int value=map.get(“阻止我”);
为了更加方便地使用集合,请查看。太棒了

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("Stop Me", 11);
map.put("Feed Me", 12);
map.put("Walk Me", 13);
Integer x; // little hack
int value = (x = a.get("aaa")) == null? 0 : x;
测试:


难民?那不是一种罪恶的状态吗?:)更像是一个顿悟:)ArrayList是一个序列或类似列表的构造(不是字典),尽管它是泛型的。您的最后一行是危险的:如果该键的映射中没有值,它将抛出NullPointerException,因为您使用了unboxingYes,很好。自动装箱非常好,但取消装箱并没有真正起到多大作用。继续使用@NotNull注释重复注释:您的最后一行很危险:如果映射中该键没有值,它将抛出NullPointerException,因为您使用了取消装箱。映射中有一个值与该键一起!但是为了澄清这一点,您应该首先通过调用映射的contains方法和/或检查get(key)的结果是否为null来检查缺少的键。后者不太可能,因为在objects.Oops之间传递mulls是一种糟糕的做法。我的意思是“nulls”而不是“mulls”。如果O是正确的,那么地图解释应该是+1。HashMap和LinkedHashMap提供恒定的时间-O(1)-性能,而不是O(n)。它们最糟糕的性能(即所有对象都有相同的散列)是O(n)。我意识到我输入了错误的对象,发现您刚刚在纠正错误方面击败了我!重复注释:您的最后一行很危险:如果映射中该键处没有值,它将抛出NullPointerException,因为您使用了Unboxing。让我们希望用户的名称是合法的java标识符。如果枚举中null以某种方式是一个值,那么它就不是真正的枚举。枚举应该枚举可能的值
int i = m.get("Stop me").intValue()
Map<String, Integer> entries = new HashMap<String, Integer>();
entries.put("Stop me", 11);
entries.put("Feed me", 12);
entries.put("Walk me", 13);
int value = entries.get("Stop me"); // if you know it exists
// If you're not sure whether the map contains a value, it's better to do:
Integer boxedValue = entries.get("Punch me");
if (boxedValue != null) {
    int unboxedValue = boxedValue;
    ...
}
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Stop me", 11);
map.put("Feed me", 12);

int value = map.get("Stop me");
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("Stop Me", 11);
map.put("Feed Me", 12);
map.put("Walk Me", 13);
Integer x; // little hack
int value = (x = a.get("aaa")) == null? 0 : x;
enum Action {

    STOP(11),
    FEED(12),
    WALK(13);

    private final int value;

    private Action(int value) {
        this.value = value;
    }

    public int value() {
        return value;
    }

    public static Action valueOf(int value) {
        for (Action action : values()) {
            if (action.value == value) {
                return action;
            }
        }

        return null; // or a null-object
    }
}
public void action() {
    Action action = Action.valueOf("FEED"); 
    // or Action.FEED for more compile-time safety
    int value = action.value();
    // instantiating by code 
    Action walk = Action.valueOf(13);
}