【问题标题】:How can I store <String, List<String>> in Java?如何在 Java 中存储 <String, List<String>>?
【发布时间】:2020-07-15 10:53:44
【问题描述】:

假设我要实现一家餐厅的菜单,并且我有不同的菜名和各自的食材。

例如:

Classic: strawberry, banana, pineapple, mango, peach, honey, ice, yogurt
Forest Berry: strawberry, raspberry, blueberry, honey, ice, yogurt
...

在 python 中,我会使用字典来实现这些东西。稍后,使用这种数据结构,我需要编写一个方法,该方法首先给出一个字符串,该字符串首先包含菜的名称(键,如果我使用字典)和一个可选的用逗号分隔的成分列表,返回菜减去字符串中包含的那些(如果)。

例如,让我们使用以下配置运行方法ingredients

Smoothie.ingredients("Classic,-strawberry,-banana")

我需要的输出是:

"honey,ice,mango,peach,pineapple,yogurt"

我正在寻找最方便的 Java 数据结构来存储这种对象并执行这种操作。

【问题讨论】:

  • 如果您要问 Python 字典的 Java 等价物是什么,它是 Map
  • 不要忘记在回答您的问题时接受答案。这样,您的问题就不会在问题搜索中显示为未回答

标签: java dictionary


【解决方案1】:

您应该使用Map&lt;String,Set&lt;String&gt;&gt;。因为它是一个键值数据结构。

至于成分我建议Set&lt;String&gt;,因为我们不关心他们的顺序,但所有成分必须是独一无二的。

以下代码适用于 JDK11,但也可以重构以在旧版本中工作:

// we normalize key to upper case, to be case insensitive
private Map<String, Set<String>> menu = new HashMap<>();

@BeforeEach
void setUp() { // initialize your menu
    menu.put("CLASSIC", Set.of("strawberry", "banana", "pineapple", "mango", "peach", "honey", "ice", "yogurt"));
    menu.put("FOREST BERRY", Set.of("strawberry", "raspberry", "blueberry", "honey", "ice", "yogurt"));
}

@Test
void getMissingingredients() {
    String key = "classic";
    Set<String> startIngredients = Set.of("strawberry", "banana");
    // when
    Set<String> ingredients = getMissingIngredients(key, startIngredients);
    // then
    assertEquals(Set.of("pineapple", "mango", "peach", "honey", "ice", "yogurt"), ingredients);
}

private Set<String> getMissingIngredients(String dishName, Set<String> initialIngredients) {
    
    // find dish ingredients by dish name. Copy them to a new HashSet
    Set<String> ingredients = new HashSet<>(menu.getOrDefault(dishName.toUpperCase(), Collections.emptySet()));

    // remove ingredients that you already have
    ingredients.removeAll(initialIngredients);

    return ingredients;
}

【讨论】:

    【解决方案2】:

    如何在 Java 中存储

    这是一个multimapGuava(第 3 方 Java 库)提供了它的实现。

    根据你的例子,你可以像 in 一样使用它

    public static void main(String[] args) {
    
        Multimap<String, String> multimap = TreeMultimap.create();
        multimap.putAll("Classic", Arrays.asList("strawberry", "banana",
                "pineapple", "mango", "peach", "honey", "ice", "yogurt") );
        multimap.putAll("Forest Berry", Arrays.asList("strawberry", "raspberry",
                "blueberry", "honey", "ice", "yogurt") );
    
        String result = multimap.get("Classic")
                .stream()
                .filter(e -> !e.equals("strawberry") && !e.equals("banana"))
                .collect(Collectors.joining(", "));
    
        System.out.println(result);
    
    }
    

    然后为您提供所需的样本输出

    honey, ice, mango, peach, pineapple, yogurt
    

    从这里,您可以进一步概括。

    (请注意,TreeMultimap 是一种不存储重复键值对的实现,键和值按其自然顺序或提供的比较器排序。)

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 2013-01-15
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多