在 Java 中实例化和初始化“多级”映射

努伊索利维拉

我试图在不使用大量 if/ else 的情况下解决BeeCrowd 中的这个问题。

蜂群问题

它包括从使用中读取 3 个输入,例如:

vertebrado
ave
carnivoro

并输出这些输入的对应词。

aguia

我比java更了解python,这将是我在python中的解决方案(有效):

dict = {
  "vertebrado": {
    "ave": {
      "carnivoro": "aguia",
      "onivoro": "pomba"
    },
    "mamifero": {
      "onivoro": "homem",
      "herbivoro": "vaca"
    }
  },
  "invertebrado": {
    "inseto": {
      "hematofago": "pulga",
      "herbivoro": "lagarta"
    },
    "anelideo": {
      "hematofago": "sanguessuga",
      "onivoro": "minhoca"
    }
  }
}

word1 = input()
word2 = input()
word3 = input()

word = dict[word1][word2][word3]

print(word)

但是,我正在努力用 Java 编写一个好的解决方案。这是我当前的 Java 解决方案(也可以):

import java.util.Scanner;
import java.util.HashMap;

public class Main {
    public static void main (String[]args) {
        Scanner scanner = new Scanner(System.in);
        String word1 = new String(scanner.nextLine());
        String word2 = new String(scanner.nextLine());
        String word3 = new String(scanner.nextLine());
        
        HashMap<String, HashMap<String, HashMap<String, String>>> dict = new HashMap();
        dict.put("vertebrado",  new HashMap<String, HashMap<String, String>>());
        dict.put("invertebrado", new HashMap<String, HashMap<String, String>>());
        
        dict.get("vertebrado").put("ave", new HashMap<String, String>());
        dict.get("vertebrado").put("mamifero", new HashMap<String, String>());
        
        dict.get("invertebrado").put("inseto", new HashMap<String, String>());
        dict.get("invertebrado").put("anelideo", new HashMap<String, String>());
        
        dict.get("vertebrado").get("ave").put("carnivoro", "aguia");
        dict.get("vertebrado").get("ave").put("onivoro", "pomba");
        dict.get("vertebrado").get("mamifero").put("onivoro", "homem");
        dict.get("vertebrado").get("mamifero").put("herbivoro", "vaca");
        
        dict.get("invertebrado").get("inseto").put("hematofago", "pulga");
        dict.get("invertebrado").get("inseto").put("herbivoro", "lagarta");
        dict.get("invertebrado").get("anelideo").put("hematofago", "sanguessuga");
        dict.get("invertebrado").get("anelideo").put("onivoro", "minhoca");
        
        
        String word = dict.get(word1).get(word2).get(word3);
        
        System.out.println(word);
    }
}

该解决方案的明显问题是,以这种方式填充 dict 是不切实际的。代码已经很大了。如果dict有很多价值观,有很多“深度”,那么维护将成为地狱。

有没有办法减少它?IE,dict在几行中声明和初始化?

tgdaives

使用 Map.of() 作为 MC Emperor 建议:

Map<String, Map<String, Map<String, String>>> dict = Map.of(
    "vertebrado",
        Map.of(
            "ave",
                Map.of(
                    "carnivoro", "aguia",
                    "onivoro", "pomba"
                ),
            "mamifero",
                Map.of("onivoro","homem",
                        "herbivoro","vaca"
                )
        ),
    "invertebrado",
        Map.of(
            "inseto",
                Map.of(
                    "hematofago", "pulga",
                    "herbivoro", "lagarta"
                ),
            "anelideo",
                Map.of(
                    "hematofago","sanguessuga",
                    "onivoro","minhoca"
                )
        )
);

与使用json文件相比,这还可以让您随时进行类型检查,尽管为了真正确保类型安全,您需要引入名为的类PhylumClass包装Order您的字符串,而不是留下“字符串类型”的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章