0

我有以下代码,一个带有水果数组列表的 Treemap。在 removeAndAdd 函数中,我想删除 [apple,orange] 并将其添加到容器 2 的 bList 中。但显示出来的是额外的括号 []。我的方法正确吗?

public class TreeMapEx {

  private TreeMap<Integer, List<String>> tMap = new TreeMap<Integer, List<String>>();
  private List<String> aList = new ArrayList<String>();
  private List<String> bList = new ArrayList<String>();
    public static void main(String[] args) {
       TreeMapEx tm = new TreeMapEx();
        tm.addToTree();
        tm.addToList(1);
        tm.showItem(1);       
        tm.showItem(2);
        tm.removeAndAdd(1);
        tm.showItem(2);

    }

    private void addToTree() {
        tMap.put(1, aList);        
        bList.add("dragonfruit");
        tMap.put(2, bList);

    }

    private void addToList(int item) {
        if (tMap.containsKey(item)) {
            aList = new ArrayList<String>();
            aList.add("apple");
            aList.add("orange");
            tMap.put(item, aList);
            System.out.println(item + " added");
        } else {
            System.out.println(item + " not found");
        }
    }

    private void showItem(int item){

        System.out.println(item+" contain " + tMap.get(item));
    }

      private void removeAndAdd(int item){
          if (tMap.containsKey(item) && tMap.containsValue(aList)) {
          //remove everything from 1 and add to 2
           aList = new ArrayList<String>();
             List<String> temp;
             temp = tMap.get(item);

             bList.add(temp.toString());
          }         
    }

}

Output:
1 added
1 contain [apple, orange]
2 contain [dragonfruit]
2 contain [dragonfruit, [apple, orange]]

如何移除容器 2 中 [apple, orange] 的附加支架。

对于这样的事情

1 added
1 contain [apple, orange]
2 contain [dragonfruit]
2 contain [dragonfruit,apple, orange]
4

1 回答 1

2

[apple, orange] 的附加括号正在打印,因为在方法showItem中使用了以下代码。

System.out.println(item+" 包含" + tMap.get(item));

相当于使用下面的代码打印 List 的元素。

System.out.println(item+" 包含 " + tMap.get(item).toString() );

注意:tMap.get(item)是一个List类型(List)

如果要显示没有附加括号的元素。您可以使用以下代码:

    private void showItem(int item){
        System.out.println(item+" contain ");
        for(String str:tMap.get(item) )
        {
            System.out.println( str);
        }
    } 

此外,还有一件事没有正确使用。请参考方法removeAndAdd

更改bList.add(temp.toString()) ; 到 bList.addAll(temp)

如果使用 bList.add(temp.toString()),带有 [apple, orange] 的 List 元素将作为字符串添加到 bList。实际上,您想将它与苹果和橙子分开添加。使用bList.addAll(temp)

看看为什么Collection,比如List print 额外的括号被加了。请参考java.util.AbstractCollection的源代码,它覆盖了 toString 方法。代码如下:

public String toString() {
    Iterator<E> it = iterator();
    if (! it.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = it.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! it.hasNext())
            return sb.append(']').toString();
        sb.append(',').append(' ');
    }
}
于 2013-10-27T05:21:45.410 回答