首页 文章

如何将集合转换为列表?

提问于
浏览
240

我正在使用Apache Collections库中的 TreeBidiMap . 我想对 doubles 的值进行排序 .

我的方法是使用以下方法检索 Collection 的值:

Collection coll = themap.values();

这自然很好 .

Main Question: 我现在想知道如何转换/转换(不确定哪个是正确的) collList 所以它可以排序?

然后我打算遍历排序的 List 对象,该对象应按顺序从 TreeBidiMapthemap )使用 themap.getKey(iterator.next()) 获取相应的键,其中迭代器将在 doubles 列表上 .

8 回答

  • 7
    List list = new ArrayList(coll);
    Collections.sort(list);
    

    正如Erel Segal Halevi在下面所说,如果coll已经是一个列表,你可以跳过第一步 . 但这取决于TreeBidiMap的内部 .

    List list;
    if (coll instanceof List)
      list = (List)coll;
    else
      list = new ArrayList(coll);
    
  • 4

    像这样的东西应该工作,调用带有集合的ArrayList constructor

    List theList = new ArrayList(coll);
    
  • 1

    我认为Paul Tomblin的答案可能是浪费,以防coll已经是一个列表,因为它将创建一个新列表并复制所有元素 . 如果coll包含许多元素,这可能需要很长时间 .

    我的建议是:

    List list;
    if (coll instanceof List)
      list = (List)coll;
    else
      list = new ArrayList(coll);
    Collections.sort(list);
    
  • -3

    我相信你可以这样写:

    coll.stream().collect(Collectors.toList())
    
  • 406
    Collections.sort( new ArrayList( coll ) );
    
  • 12

    @Kunigami:我想你可能会误认为是Guava的 newArrayList 方法 . 它不检查Iterable是否是List类型,只是按原样返回给定的List . 它总是创建一个新列表:

    @GwtCompatible(serializable = true)
    public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
      checkNotNull(elements); // for GWT
      // Let ArrayList's sizing logic work, if possible
      return (elements instanceof Collection)
          ? new ArrayList<E>(Collections2.cast(elements))
          : newArrayList(elements.iterator());
    }
    
  • 78

    你要求的是一个非常省钱的操作,确保你不需要经常这样做(例如在一个循环中) .

    否则,您可以创建自定义集合 . 我想出了一个你的 TreeBidiMapTreeMultiset . 仅实施您需要的内容并关注数据完整性 .

    class MyCustomCollection implements Map<K, V> {
        TreeBidiMap<K, V> map;
        TreeMultiset<V> multiset;
        public V put(K key, V value) {
            removeValue(map.put(key, value));
            multiset.add(value);
        }
        public boolean remove(K key) {
            removeValue(map.remove(key));
        }
        /** removes value that was removed/replaced in map */
        private removeValue(V value) {
            if (value != null) {
                multiset.remove(value);
            }
        }
        public Set keySet() {
            return map.keySet();
        }
        public Multiset values() {
            return multiset;
        }
        // many more methods to be implemented, e.g. count, isEmpty etc.
    }
    

    这样,您从 values() 返回 sorted Multiset . 但是,如果你需要它作为一个列表(例如你需要类似于数组的 get(index) 方法),你必须发明一些更复杂的东西 .

  • 31

    这是一个单线程的次优解决方案:

    Collections.list(Collections.enumeration(coll));
    

相关问题