【问题标题】:HashMap first key is nullHashMap 第一个键为空
【发布时间】:2013-09-03 12:21:46
【问题描述】:

我正在使用 hasmap 和 LinkedHasmap 一段时间,但现在在这种情况下表现得很奇怪,我正在向 hasmap 添加一个键和一个来自 2 个具有相同大小的数组的值,在这种情况下,大小 = 4,但是hasmap在调试中将第一个键设置为null,我看到它会覆盖相同位置的第二个键有第一个,它从来没有相同的键,所以我无法理解发生了什么。

hasmap 被声明有一个字段。

    private HashMap<String, String> courses = new HasMap<String, String>();

在这个方法中我想填充hasMap:

private void coursesInit(int coursesListSize) {

    for (int j = 0; j < coursesListSize; j++) {

        LayoutInflater inflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        LinearLayout inserPoint = (LinearLayout) findViewById(R.id.linear_layout_inside_left);

        LinearLayout row = new LinearLayout(this);
        row.setLayoutParams(new LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
        View view = inflater.inflate(R.layout.courses_button_left_drawer,
                null);

        Button btnTag = (Button) view.findViewById(R.id.course_id);
        btnTag.setLayoutParams(new LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.WRAP_CONTENT));

        if (coursesIdList.isEmpty()) {
            btnTag.setText("Your Course " + (j + 1));
            btnTag.setId(j);

        } else {
            btnTag.setText(coursesNamesList.get(j));
            btnTag.setId(Integer.parseInt(coursesIdList.get(j)));

        // Populate LinkedHasMap in the correct order where Key=
        // course_id && Value= course_fullname
        courses.put(coursesIdList.get(j), coursesNamesList.get(j));

        }

        if (j != 0) {
            btnTag.setBackgroundResource(R.drawable.border_inside);
        }

        row.addView(view);

        inserPoint.addView(row, 3);
    }

}

我也尝试过只使用 Map 和 LinkedHasMap 并在一个只使用 for 循环数组但结果相同的方法内。

调试截图:

课程有地图: Courses Hasmap

数组: Arrays

【问题讨论】:

  • 你在 for 循环中膨胀了一个视图,并且你在 for 循环中也有初始化,这是不好的
  • 从您的代码 sn-ps 我无法确定问题出在哪里。请发布其他相关代码
  • 是的,我现在,这个方法只是为了测试,但可以肯定初始化应该在我的错误之外;)

标签: java android arrays hashmap


【解决方案1】:

如果您的问题是调试器中HashMap 实例的table[0] 元素是null,那么只要HashMap 按照文档中的说明工作(确实如此),这不是问题.内部实现细节对您来说并不重要(它是一个供您使用的黑匣子)。如果要检索地图的键,请使用HashMap#entrySet

请参阅以下 HashMap 中的单个插入示例以及生成的 HashMap#table 字段:

 final Map<String, String> map = new HashMap<String, String>();
 map.put("One", "1");

如您所见,元素插入到table[12]

还要记住HashMap allows null as key,所以如果你将key设置为null,这是一个有效的key。

【讨论】:

  • 似乎更可能的实际问题是arraylists(id/name)中有四个值,而hashmap中只有三个条目。我认为null 只是一个红鲱鱼。当然,我们不知道coursesListSize 是否真的从这个 sn-p 中反映了正确的大小。
  • 但是 Hasmap 表应该有我丢失的密钥?在这种情况下,键=6 值= 操作系统?如果我执行 course.get("6"),hasmap 会检索到正确的值吗?
  • 哪个钥匙丢了?你怎么知道钥匙丢了? table 索引不是您的密钥。展开地图条目,您可以看到键及其值。或致电HashMap#entrySet,您可以在那里查看。
  • 感谢 Moskito,你说得对,它确实是一个黑匣子,我现在尝试了 courses.get,一切都在正确的位置,我的错误是没有尝试,因为在调试中我看不到它,所以我从来没有试过了。这是一个新手的谜,对不起,谢谢你的时间
  • 是的,但在你提醒我之前,表格索引是我的键,现在阅读的重点是我理解的 hasmap 文档
猜你喜欢
  • 2014-12-01
  • 2017-07-06
  • 2023-03-16
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2016-12-06
  • 1970-01-01
相关资源
最近更新 更多