2014-05-03 20 views
4

我試圖反轉一個不可修改的列表。然而,我試圖實現它,但是有可能更新或反向和不可修改的列表?我知道我們可以用谷歌不可變列表如何在Java中反轉一個不可修改的列表

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); 
    } 

} 

做在上面的程序我只是遍歷從後unmodifable列表,並把它們放在一個陣列中後,加入該數組新修改的列表。我們能否以更好的方式在優化方面做到這一點?

+0

番石榴的'ImmutableList'' reverse'方法只是將原ImmutableList的內容複製到一個可變列表中,調用'Collections.reverse'並返回一個新的'ImmutableList'。它不會修改原始的'ImmutableList'(就像你似乎一樣)。 –

+0

是的,我知道番石榴的,但它有可能實現不可修改?因爲如果我進行任何操作,我在不可修改列表中獲得不受支持的操作異常 – vkrams

+0

唯一的方法是複製原始不可變列表的內容,反轉列表(或者如果向後循環,則不做任何操作),然後製作它不可變,就像番石榴一樣。 –

回答

2

當列表是不可修改的,無論如何,你可以創建列表上的逆轉視圖

這是在性能和​​存儲方面優化:它需要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(); 
      } 
     }; 
    } 

} 
2

可能不是最好的解決辦法,但更好,然後我們自己反轉:

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 
} 
+1

我不認爲這是更好的解決方案來反向循環,因爲您正在複製列表一次,然後顛倒列表。這肯定比反向循環和直接分配具有更多的訪問。 – anirudh

+0

它不是關於訪問量,而是關於總體持續時間。複製列表是一種痛苦,這是正確的。但是Collections.reverse只是關於使用set()的indexmanipulation。除此之外,來自Vikram的原始代碼可以通過在每個循環中不調用來優化.size():final int size = unmodifiableList.size(); for(int i = size; i> 0; i--) – salyh

+0

對不起我的困惑,但我不明白。 Vikram的方法只是循環一次列表並將值添加到目標列表,因此這兩個列表的所有值都只被觸及一次。這與複製相同,但在您的方法中,您在複製後執行額外的步驟,那麼如何在更短的時間內完成? – anirudh

4

番石榴的Lists.reverse(List)返回原始列表的逆轉看,沒有做任何的複製。

相關問題