繁体   English   中英

如何在java中反转不可修改的List

[英]How to reverse an unmodifiable List in java

我试图扭转一个不可修改的列表。 但是我试图实现它但是有可能更新或反向和不可修改的列表吗? 我知道我们可以使用Google Immutable List

import java.util.*;

public class ImmutableList 
 {

public static void main(String args[])
{
    String[] mylist = {"Apple","Orange","Mango","Kiwi","Banana"};
    List reverselist = new ArrayList();
    List<String> strList = Arrays.asList(mylist);
    List<String> unmodifiableList = Collections.unmodifiableList(strList);
    for(int i=unmodifiableList.size();i>0;i--)
    {
        reverselist.add(unmodifiableList.get(i-1));

    }
    List<String> reverse = Collections.unmodifiableList(reverselist);
    System.out.println(reverse);
  }

 }

在上面的程序中,我只是从后面遍历不可修改的列表,并在将该数组添加到新的不可修改列表之后将它们放入数组中。 我们能否在优化方面做得更好?

Guava的Lists.reverse(List)返回原始列表的反转视图,而不进行任何复制。

可能不是最好的解决方案,但最好是逆转自己:

public List<T> reverseUnModList(List<T> unModListOrig) {
    List<T> tmpList = new ArrayList<T>(unModListOrig); 
    Collections.reverse(tmpList);
    return Collections.unmodifiableList(unModListOrig);
    //return tmpList; //if the result not need to be unmodifieable
}

无论如何,当列表无法修改时,您只需在列表中创建反向视图即可

这在性能和存储方面是最佳的:它需要O(1)时间O(1)额外空间来创建此列表。

import java.util.AbstractList;
import java.util.Arrays;
import java.util.List;

public class ReversedListViewTest
{
    public static void main(String[] args)
    {
        String[] array = {"Apple","Orange","Mango","Kiwi","Banana"};

        List<String> list = Arrays.asList(array);
        System.out.println("List         : "+list);

        List<String> reversedView = reversedView(list);
        System.out.println("Reversed view: "+reversedView);
    }

    private static <T> List<T> reversedView(final List<T> list)
    {
        return new AbstractList<T>()
        {
            @Override
            public T get(int index)
            {
                return list.get(list.size()-1-index);
            }

            @Override
            public int size()
            {
                return list.size();
            }
        };
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM