【问题标题】:LinkedHashMap with ArrayList - How to load ArrayList?LinkedHashMap 与 ArrayList - 如何加载 ArrayList?
【发布时间】:2013-10-21 21:01:04
【问题描述】:

我对 Java 还很陌生,我正在尝试加载一个包含值 ArrayList 的 LinkedHashMap。我正在尝试从基于 API 的查询结果 (Salesforce) 的查询结果中加载值。

这是错误:“不能引用以不同方法定义的内部类中的非最终变量细分” - 细分变量带有红色下划线,给出此消息,我注意到下面关注的行。

代码

public LinkedHashMap<String, ArrayList<String>> sfFundIdsByContact;

    public ArrayList<String> getFundsIDsForContact(Contact aContact)
    {
        QueryResult queryResults = null;
        ArrayList<String> ids = new ArrayList<String>();
        int index = 0;
        Boolean done = false;
        String contactid = aContact.getId();
        String SCCPBId = null;

        if(sfFundIdsByContact == null || sfFundIdsByContact.size() <= 0){

       //Do the Salesforce API CALL and Return the results  
       ...          
       while (! done) 
       {        
        SObject[] records = queryResults.getRecords();

        for ( int i = 0; i < records.length; ++i ) 
            {
                    if(sfFundIdsByContact.containsKey(breakdown.getSalesConnect__Contact__c())){
                        sfFundIdsByContact.get(breakdown.getSalesConnect__Contact__c()).add(breakdown.getId());
                    } else {
//Line below in the add(breakdown.getId() - contains the error
                    sfFundIdsByContact.put(breakdown.getSalesConnect__Contact__c(), new ArrayList<String>() {{ add(breakdown.getId()); }});

        }

    }

感谢所有建议。

【问题讨论】:

  • 错误提示是不是不够好?
  • 如果他是 Java 或编程新手,可能不会。
  • 抱歉,你们太快了 ;) - 我在获取“代码”部分的代码时遇到了一些问题,但现在应该没问题了。

标签: java arraylist linkedhashmap


【解决方案1】:

在您的 else 块中,而不是:

new ArrayList<String>() {{ add(**breakdown.getId()**); }}

你可以使用:

new ArrayList<String>(Arrays.asList(breakdown.getId())

或者,由于您只想要一个元素 ArrayList,您可以使用 Collections.singletonList 来避免创建临时可变参数数组:

new ArrayList<String>(Collections.singletonList(breakdown.getId())

new ArrayList&lt;&gt;() 之后的{ ... } 创建了ArrayList 的匿名子类,它只是一个内部类。在内部类中,您不能访问非final 局部变量。

【讨论】:

  • new ArrayList&lt;String&gt;(Collections.singletonList(breakdown.getId())。这将保存临时可变参数数组。
  • 没有必要使用new ArrayList&lt;String&gt;,只需使用Arrays.asList(breakdown.getId()(假设getId()返回String)。
  • @LuiggiMendoza 我想在这里也可以。但只是为了给 OP 一个等效的代码而不改变我写的行为。 asList 返回固定大小的列表对吗?
  • 在 HotSpot 中,Arrays#asList 只是将其实现为 return new ArrayList&lt;T&gt;(T[] array),因此您最终会从另一个 ArrayList 创建一个 ArrayList
  • @Luiggi Mendoza:那么地图的类型LinkedHashMap&lt;String, ArrayList&lt;String&gt;&gt;必须改为LinkedHashMap&lt;String, List&lt;String&gt;&gt;
【解决方案2】:

您可以通过始终在for 循环中检索List 值来简化代码,然后如果它是null,则创建一个新值并将其添加到您的Map,否则将值添加到列表中.

for (int i = 0; i < records.length; i++) {
    List<String> value = sfFundIdsByContact.get(breakdown.getSalesConnect__Contact__c());
    if (value == null) {
        value = new ArrayList<String>();
        sfFundIdsByContact.put(breakdown.getSalesConnect__Contact__c(), value);
    }
    value.add(breakdown.getId());
}

作为建议,更改定义

LinkedHashMap<String, ArrayList<String>> sfFundIdsByContact

Map<String, List<String>> sfFundIdsByContact

参考What does it mean to "program to an interface"?

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多