2014-05-03 8 views
4

J'essaie d'inverser une liste non modifiable. Cependant j'ai essayé de le réaliser mais est-il possible de mettre à jour ou de renverser et de liste non modifiable? Je sais que nous pouvons le faire avec Google Liste ImmuableComment inverser une liste non modifiable dans 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); 
    } 

} 

Dans le programme ci-dessus je traversais dans la liste juste unmodifable de dos et de les mettre dans un tableau après que l'ajout de ce tableau à la nouvelle liste non modifiable. Peut-on le faire mieux en termes d'optimisation?

+0

La méthode 'ImmutableList' de' de 'de' de Guava copie juste le contenu de l'original 'ImmutableList' dans un mutable, appelle 'Collections.reverse' et retourne une nouvelle' ImmutableList'. Cela ne modifie pas l'original 'ImmutableList' (comme vous le semblez bien). –

+0

Ouais je connais le goyave mais est-il possible de le réaliser en non modifiable? Parce que si je fais une opération, je reçois une exception d'opération non supportée dans la liste non modifiable – vkrams

+0

La seule façon est de copier le contenu de la liste immuable d'origine, d'inverser la liste (ou ne rien faire si vous bouclez en arrière) et ensuite faire c'est immuable, comme le fait Guava. –

Répondre

2

Lorsque la liste est non modifiable de toute façon, vous pouvez simplement créer une vue inversée sur la liste.

Ceci est optimal en termes de performance et de stockage: Il faut O (1) et le tempsO (1) espace supplémentaire pour créer cette liste.

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

Peut être pas la meilleure solution mais mieux puis inversez nous-même:

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

Je ne pense pas que ce soit une meilleure solution pour inverser la boucle, car vous copiez la liste une fois et inversez la liste. Cela a certainement plus d'accès que le reverse looping et l'assignation directe. – anirudh

+0

Ce n'est pas sur le nombre d'accès, c'est sur la durée totale. Copier la liste est une douleur, c'est vrai. Mais Collections.reverse ne concerne que l'indexmanipulation utilisant set(). En dehors de cela, le code original de Vikram peut être optimisé en n'utilisant pas chaque boucle .size(): final int taille = unmodifiableList.size(); for (int i = taille; i> 0; i--) – salyh

+0

Désolé pour ma confusion, mais je ne comprends pas. La méthode de Vikram boucle une fois la liste et ajoute les valeurs à la liste de destination, ainsi toutes les valeurs des deux listes ne sont touchées qu'une seule fois. C'est la même chose que la copie, mais dans votre méthode, vous faites des étapes supplémentaires après la copie, alors comment peut-on le faire en moins de temps? – anirudh

4

Lists.reverse(List) de Goyave renvoie une vue inversée de la liste initiale, sans faire de copie.

Questions connexes