【问题标题】:Confusion in chossing data structure选择数据结构的困惑
【发布时间】:2017-04-09 15:52:09
【问题描述】:

我想创建一个Map<Long, Enum< ? extends SomeInterface>。哪个最适合我?

我试过这个

private Map<Long, Enum<? extends SomeInterface>[]> questionIdToanswersMapping = Collections.unmodifiableMap(Stream.of(
        new SimpleEntry<>(QuestionEnum1.getQuestionId(), AnswerEnum1.values()),
        new SimpleEntry<>(QuestionEnum2.getQuestionId(), AnswerEnum2.values()),
        new SimpleEntry<>(QuestionEnum3.getQuestionId(), AnswerEnum3.values()),
        new SimpleEntry<>(QuestionEnum4.getQuestionId(), AnswerEnum4.values()),
        new SimpleEntry<>(QuestionEnum5.getQuestionId(), AnswerEnum5.values()))
.collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue())));

但它给出错误“无法从Map&lt;Object,Object&gt; 转换为Map&lt;Long,Enum&lt;? extends SomeEnum&gt;[]&gt;”。我是新来的。请帮忙!

我需要不可修改的问题 ID 映射到相应的可能答案值。可能的答案是枚举

可能的答案是这样包装的:

public class RecognizedAnswers {
public enum AnswerEnum1 implements SomeInterface;
public enum Answer2 implements SomeInterface;
 }

【问题讨论】:

  • 那么对于每个 QuestionId,都有相同的 AnswerEnum 集,它们有什么不同?
  • 它们是不同的。每个 AnswerEnum 扩展 SomeEnum
  • 但是总结不出来。在您的示例中,您有一组答案,根据描述,您需要将单个 QuestioId 映射到单个答案
  • 我更新了问题。由于我在发布问题之前更改了变量名称,因此我错过了这一点。每个 AnswerEnum 扩展 SomeEnum
  • 在 Java 中,我认为不可能扩展枚举

标签: java collections enums hashmap unmodifiable


【解决方案1】:

我认为命名有一个小问题:

您不能在 java 中用另一个枚举扩展一个枚举,而是使用具有所需方法的接口,如下所示

以下代码运行良好:

   @Test
    public void test() {
        Map<Long, Enum<? extends SomeEnum>[]> questionIdToanswersMapping = Collections.unmodifiableMap(Stream.of(
                new AbstractMap.SimpleEntry<>(QuestionEnum1.A.getQuestionId(), AnswerEnum1.values()),
                new AbstractMap.SimpleEntry<>(QuestionEnum1.B.getQuestionId(), AnswerEnum1.values()),
                new AbstractMap.SimpleEntry<>(QuestionEnum1.C.getQuestionId(), AnswerEnum2.values()),
                new AbstractMap.SimpleEntry<>(QuestionEnum1.D.getQuestionId(), AnswerEnum2.values())
                )
                .collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue())));

        System.out.print(questionIdToanswersMapping.size());
    }

    enum QuestionEnum1 {
        A, B, C, D;

        Long getQuestionId() {
            return (long) name().hashCode(); // my mocked values
        }

    }

    interface SomeEnum {

    }

    enum AnswerEnum1 implements SomeEnum {

    }
    enum AnswerEnum2 implements SomeEnum {

    }

【讨论】:

  • 谢谢!关键是所有 QuestionEnums 都包含在一个类中。我已经更新了这个问题。上面的代码给出了问题中提到的相同错误
【解决方案2】:

我试图复制你的例子(因为你混淆了枚举类型,我自己编了),它似乎编译得很好:

enum SomeEnum { FOO, BAR }

private Map<Long, Enum<? extends SomeEnum>[]> exampleMap =
    Collections.unmodifiableMap(Stream.of(
        new SimpleEntry<>(1L, SomeEnum.values()))
      .collect(Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue)));

我的猜测是您要么缺少括号,要么您的 QuestionEnum1.getQuestionId() 返回 int 而不是 long,这些事情使编译器感到困惑,以至于它无法给出明确的错误消息。

我会注意到,Stream API 确实不是构造常量映射的干净方法。即使需要static {} 块或辅助函数,简单地使用Map.put()“正常”构建这样的地图可能会更简单、更容易阅读。使用Guavaimmutable collections 可以做得更好,可以这样使用:

private final ImmutableMap<Long, Enum<? extends SomeEnum>[]> questionIdToanswersMapping =
    ImmutableMap.builder()
        .put(QuestionEnum1.getQuestionId(), AnswerEnum1.values())
        .put(QuestionEnum2.getQuestionId(), AnswerEnum2.values())
        .put(QuestionEnum3.getQuestionId(), AnswerEnum3.values())
        .put(QuestionEnum4.getQuestionId(), AnswerEnum4.values())
        .put(QuestionEnum5.getQuestionId(), AnswerEnum5.values())
        .build();

更清晰、更易于阅读(和编写)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2011-01-21
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多