6

変更不可能なリストを元に戻そうとしています。しかし、私はそれを達成しようとしましたが、変更不可能なリストを更新または逆にすることは可能ですか? 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);
  }

 }

上記のプログラムでは、変更不可能なリストを後ろからトラバースし、それらを配列に入れ、その配列を新しい変更不可能なリストに追加しています。最適化の観点から、より良い方法でそれを行うことはできますか?

4

3 に答える 3

6

Guava'sLists.reverse(List)は、コピーを行わずに、元のリストの逆のビューを返します。

于 2014-05-03T19:55:03.583 に答える
3

とにかくリストが変更できない場合は、リストに逆のビューを作成できます。

これは、パフォーマンスとストレージの点で最適です。このリストを作成するには、 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();
            }
        };
    }

}
于 2014-05-03T13:40:11.140 に答える
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
}
于 2014-05-03T10:44:15.027 に答える