[英]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.