【问题标题】:Adding two values to a key in a HashMap in Java将两个值添加到 Java 中的 HashMap 中的键
【发布时间】:2016-04-03 00:52:44
【问题描述】:

我使用的文件包含:

"word","wordtype","definition"

"Base","n.","The lower part of a robe or petticoat."

"Base","n.","An apron."

输出如下:

key: "base" value: ["word""wordtype""definition", "Base""n.""The lower part of a robe or petticoat.", "Base""n.""An apron."] key: "word" value: ["word""wordtype""definition", "Base""n.""The lower part of a robe or petticoat.", "Base""n.""An apron."]

期望的结果:

key: "base" value: [ "Base""n.""The lower part of a robe or petticoat.", "Base""n.""An apron."] key: "word" value: ["word""wordtype""definition"]

有人能指出正确的方向吗?

BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream(file)));

    String line = null;

    TreeMap<String, List<String>> def = new TreeMap<String, List<String>>();
    List<String> values = new ArrayList<String>();

        try {
            while ((line = br.readLine()) != null) {
                String []parts =line.split(",");
                String key = null;
                for (int i = 0; i < parts.length; i++){
                    key = parts[0];
                }

                values.add(parts[0] + parts[1] + parts[2]);
                def.put(key.toLowerCase(), values);

            }

【问题讨论】:

  • 对于初学者:key = parts[0] 不应处于循环中; values 应该是在您的 while 循环中定义的一个新变量,并且您应该一次将要添加的每个部分添加到值列表中,而不是将它们与 + 连接在一起。
  • 您不能为此使用地图。一个key 必须对应一个(或没有)value。如果你想要类似的功能;你可以使用List&lt;Map.Entry&lt;String, String&gt;&gt;

标签: java hashmap key


【解决方案1】:

Map 无法按您的要求工作。任何key 只能映射到单个value

如果您想要与您正在做的事情类似的东西,但是对于给定的key,您可以有多个values,您可以执行以下操作:

List<Map.Entry<String, List<String>>> def = new ArrayList<>();

Map.Entry<String, List<String>> entry = new AbstractMap.SimpleEntry<>(key, list);
def.add(entry);

然后遍历你的def:

for (Map.Entry<String, List<String>> entry : def) {
    System.out.println(String.format("Key: %s.  Values: %s",
            entry.getKey(),
            Arrays.toString(entry.getValue().toArray())));
}

编辑:

对于您的评论:如果您愿意,您可以随时滚动自己的类型以存储在Map(或List,如果您仍然需要重复键):

class WordDescription {
    final String wordType;
    final String definition;

    WordDescription(String wordType, String definition) {
        this.wordType = wordType;
        definition = definition;
    }

    String getWordType() {
        return wordType;
    }

    String getDefinition() {
        return definition;
    }
}

并在List&lt;Map.Entry&lt;String, WordDescription&gt;&gt; 中使用它。如果有一组预定义的 wordTypeenum(形容词、名词等),您可以将它们设为。

【讨论】:

  • 谢谢,理想情况下,我希望 key 作为 word,value 作为 key wordtype 和 definition,但地图中不能有重复的键
  • @b.d 已编辑答案,为您正在寻找的内容提供进一步帮助。
  • 他编辑的回复真的是你想要的。您想要存储 String->YourCustomObject。我个人会将实际单词添加到您的 WordDescription 对象中。虽然您可能认为它是重复的,因为它已经是您地图的关键,但您最终会在未来从对象中获得更好的可重用性和封装性。假设您返回一个 WordDescription 并将其传递给程序的另一部分或存储在另一个数据结构中;如果你丢失了 map 键,你就不再有任何关于你的对象代表什么词的上下文。
  • @dev.glitch 是的,我想这正是我需要的,谢谢
猜你喜欢
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2020-08-12
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多