【问题标题】:How to store and access 2 different types of List in a HashMap如何在 HashMap 中存储和访问 2 种不同类型的 List
【发布时间】:2020-03-06 22:40:02
【问题描述】:

我试图在 HashMap 中存储和访问 2 种不同类型的 List,并在调用返回 HashMap 的方法时访问它们,但我收到此错误: The constructor ArrayList<JournalArticle>(Object) is undefined
该方法如下所示:

public static HashMap<String, Object> getJournalArticles(long groupId) throws NumberFormatException, SystemException{
    List<JournalArticle> journalArticles = JournalArticleLocalServiceUtil.getStructureArticles(groupId);
    List<String> allJournalArticleIds = new ArrayList<String>();
    for (JournalArticle journalArticle : journalArticles) {
        allJournalArticleIds.add(journalArticle.getArticleId());
    }

    HashMap<String, Object> mapArticles = new HashMap<String,Object>();
    mapArticles.put("journalArticles", journalArticles);
    mapArticles.put("allJournalArticleIds", allJournalArticleIds);

    return mapArticles;
}

当我调用该方法并尝试将它们各自的值存储到一个新列表中时,我得到了之前注释的错误:

HashMap<String, Object> mapArticles = JournalArticleUtil.getJournalArticles(scopeGroupId);
List<JournalArticle> allArticles = new ArrayList<JournalArticle>(mapArticles.get("journalArticles"));
List<String> allJournalArticleIds = new ArrayList<String>(mapArticles.get("allJournalArticleIds"));

出了什么问题以及如何解决?

【问题讨论】:

  • 什么问题很明显(编译器抱怨它)...如何解决?可能是时候使用自定义类而不是地图了(我认为)。

标签: java list dictionary arraylist hashmap


【解决方案1】:

恕我直言,快速解决方案是将 mapArticles 的类型更改为 HashMap&lt;String, List&lt;?&gt;&gt;,然后:

List<JournalArticle> allArticles = new ArrayList<JournalArticle>((Collection<JournalArticle>)mapArticles.get("journalArticles"));
List<String> allJournalArticleIds = new ArrayList<String>((Collection<String>)mapArticles.get("allJournalArticleIds"));

因为 ArrayList 构造函数只支持这些选项:

 new ArrayList<T>();
 new ArrayList<T>(int capacity);
 new ArrayList<T>(Collection<? extends T> collection);

并且Object 在编译时不是一个集合。

【讨论】:

  • @SilverSurfer 很快,但 ernest_k 的解决方案更好。
  • 效率更高?它更快吗?你认为我应该接受他对未来访客的回答吗?如果我使用您的答案,这是一种不好的做法吗?
  • @SilverSurfer 更干净。我认为你应该接受他的回答。
【解决方案2】:

我会使用编写的类来保存这些信息(您可能会发现使用类似Pair&lt;L, R&gt; 的东西会更快):

class ArticleHolder {
    private List<JournalArticle> journalArticles;
    private List<String> allJournalArticleIds;

    public ArticleHolder(List<JournalArticle> journalArticles,
        List<String> allJournalArticleIds) {
        this.journalArticles = journalArticles;
        this.allJournalArticleIds = allJournalArticleIds;
    }

    //getters + setters
}

改变你的方法:

public static ArticleHolder getJournalArticles(long groupId) 
    throws NumberFormatException, SystemException {

    List<JournalArticle> journalArticles = 
                JournalArticleLocalServiceUtil.getStructureArticles(groupId);
    List<String> allJournalArticleIds = new ArrayList<String>();

    for (JournalArticle journalArticle : journalArticles) {
        allJournalArticleIds.add(journalArticle.getArticleId());
    }

    return new ArticleHolder(journalArticles, allJournalArticleIds);
}

除此之外:您对new ArrayList&lt;JournalArticle&gt;(...) 的调用表明您打算创建 数组列表实例(假设代码可以编译)。即使您的地图值键入为Collection 对象,也不应该这样做。

【讨论】:

  • 这是一个很好的解决方案!我正在像 vavr 一样等待 Java Core 中的 Tupples。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2015-07-21
  • 2015-09-06
  • 2013-10-04
  • 2014-03-08
  • 2017-10-22
  • 2017-01-02
相关资源
最近更新 更多