2016-11-07 3 views
0

)2つのArrayListsを持っています。Bです。私はこの2つのArrayListsを組み合わせる必要があります。 ArrayList_ Bのすべての要素をArrayList_ Aに特定の場所に配置します。 ArrayList_ 1つのArrayListの要素を別のArrayListに特定の位置に追加する最も効率的な方法(

元素組成べきでは次のようになります。 a1b1a2b2a3b3 ....

しかし、私はできる限り、最も効率の方法でこれを行います。

ルール:ArrayList_ Bを作成し、変更しないでください。

ご覧のとおり、私の例で最も効率的な方法はMethod2です。しかし、それはまだ巨大なArrayListのために非常に遅いです。

どうすれば効率的な方法を提案してください。ありがとうございました:)

パブリッククラスソリューション{

public static void main(String[] args) { 

    Method1(); 
    Method2(); 
    Method3(); 

} 

private static void Method3() { 
    ArrayList<Object> a = new ArrayList<>(); 
    ArrayList<Object> b = new ArrayList<>(); 

    for (int i = 0; i < Math.pow(2, 15); i++) { 
     a.add("a" + i); 
    } 
    for (int i = 0; i < Math.pow(2, 15); i++) { 
     b.add("b" + i); 
    } 

    ArrayList<Object> aa = new ArrayList<>(a); 
    a.ensureCapacity(2*aa.size()); 
    a.clear(); 

    long time1 = System.currentTimeMillis(); 


    for (int i = 0; i<b.size();i++) { 
     a.add(aa.get(i)); 
     a.add(b.get(i)); 
    } 
    long time2 = System.currentTimeMillis(); 

    System.out.println(time2 - time1); 
} 

private static void Method2() { 
    ArrayList<Object> a = new ArrayList<>(); 
    ArrayList<Object> b = new ArrayList<>(); 

    for (int i = 0; i < Math.pow(2, 15); i++) { 
     a.add("a" + i); 
    } 

    for (int i = 0; i < Math.pow(2, 15); i++) { 
     b.add("b" + i); 
    } 

    long time1 = System.currentTimeMillis(); 

    int size = a.size(); 
    a.add(b.get(0)); 
    for (int i = 1; i < size; i++) { 
     a.add(a.get(i)); 
     a.add(b.get(i)); 
    } 
    a.subList(1, size).clear(); 

    long time2 = System.currentTimeMillis(); 

    System.out.println(time2 - time1); 

} 

private static void Method1() { 
    ArrayList<Object> a = new ArrayList<>(); 
    ArrayList<Object> b = new ArrayList<>(); 

    for (int i = 0; i < Math.pow(2, 15); i++) { 
     a.add("a" + i); 
    } 

    for (int i = 0; i < Math.pow(2, 15); i++) { 
     b.add("b" + i); 
    } 

    long time1 = System.currentTimeMillis(); 

    a.add(1, b.get(0)); 
    for (int i = 1; i < b.size(); i++) { 
     a.add((2 * i + 1), b.get(i)); 
    } 

    long time2 = System.currentTimeMillis(); 

    System.out.println(time2 - time1); 
} 

}

+3

私はaのコピーを作成し、それをクリアしてもう一度ビルドします。容量を増やさずに最初から容量が正しいことを確認します。 'ensureCapacity(size * 2) 'を使うこともできます。コードがウォームアップされ、繰り返し実行され、そのコードをテストする最初の2秒間は無視されます。 –

+2

「Math.pow(2,15)」が何回計算されるのだろうと思います。 – vitrums

+0

ピーターローリー、あなたの助言に感謝、私はそれを手紙をしようとします。しかし、例えば、ArrayList *** A ***私はデフォルトのリストとArrayList *** B ***を入力パラメータとして持っています。新しいリストを作成せずに効率を上げるにはどうすればいいですか? – 2kich

答えて

0

ピーターの答えはおそらく最高です。しかし、これをたくさんしているのであれば、おそらく自分のクラスを定義してください。スケルトンコード、おそらくバギー、は...あなたがなどの作成、後に組み合わせリストを変更することはありません、あなたの二つの入力は、配列aとb決して変わらないことを前提としています

public class DualList<E> extends AbstractList<E> { 
    final List<E> a; 
    final List<E> b; 

    public DualList(List<E> a, List<E> b) { 
     this.a = a; this.b = b; 
    } 

    public E get(int idx) { 
     int half = idx >> 1; 
     if ((idx & 1) == 1) 
     return this.b.get(half); 
     else 
     return this.a.get(half); 
    } 

    // not sure what else you need or want to override... 
} 

これは明らかに道道速くなりますこれは何もないので、結合リストを作成していますが、これはget()を呼び出して要素を取得するたびに少し遅くなります。最終的な決定は、あなたがget()に電話している回数に依存します。

+0

ありがとう、それはまた有用です、私は私の知識ベースに入れます! :) – 2kich

関連する問題