2011-12-15 10 views
5

Javaリスト内のアイテムのインデックスを固定しておきたい。リストのインデックスをJavaで固定する方法

例コード:

import java.util.ArrayList; 
public class Test { 
    public static void main(String[] args) { 
     ArrayList<Double> a = new ArrayList<Double>(); 
     a.add(12.3); 
     a.add(15.3); 
     a.add(17.3); 

     a.remove(1); 
     System.out.println(a.get(1)); 
    } 
} 

この意志出力17.3。問題は、17.3がインデックス2にあり、今はインデックス1にあるということです!

要素を削除するときに他の要素のインデックスを保持する方法はありますか?あるいは、この目的に適した別のクラスがありますか?

注:固定サイズのコレクションは必要ありません。

答えて

5

あなたはintキーでjava.util.SortedMapを使用することがあります:

import java.util.*; 
public class Test { 

    public static void main(String[] args) 
    { 
     SortedMap<Integer, Double> a = new TreeMap<Integer, Double>(); 
     a.put(0, 12.3); 
     a.put(1, 15.3); 
     a.put(2, 17.3); 

     System.out.println(a.get(1)); // prints 15.3 
     System.out.println(a.get(2)); // prints 17.3 

     a.remove(1); 

     System.out.println(a.get(1)); // prints null 
     System.out.println(a.get(2)); // prints 17.3 
    } 
} 
  • SortedMapListのインデックスへ
  • それはキーの順序集合にマッピングされた値を格納
  • (同様の可変サイズのコレクションであります)

java.util.List#remove(int)のインプリメンテーションは、指定読み取り:

このリストの指定された位置にある要素を削除します(オプションの操作)。後続の要素を左にシフトします(インデックスから1を引きます)。リストから削除された要素を返します。上記の回答のも​​、あなたがそれはあなたが要素を挿入する順序を保持します代わりに、正規のHashMap の、LinkedHashMap<Integer,Double>を使用する必要があります提案へ

+1

次のインデックスを自分自身で管理したくない場合は、 'SortedMap'をサブクラス化して' public V put(V値) 'を追加し、サブクラス内の次のインデックスを追跡してください。 –

5

a.remove(1)の代わりにa.set(1, null)を呼び出すことができます。これは、インデックス1の値を "削除"しながら、同じ場所にすべての要素を保持します。

+0

このように、新しいタイプのリストを実装する必要があります。何か標準がありますか? – MhdSyrwan

+0

setメソッドはListインタフェースの標準メソッドです。 http://docs.oracle.com/javase/6/docs/api/java/util/List.html#set%28int,%20E%29を参照してください。 –

+0

"set"は、確かに、標準で、私が望むことを意味します。このメカニズムを使用する標準クラス – MhdSyrwan

4

インデックスと値の間の関係が常に同じである場合は、java.util.Mapを使用します。代わりにnullに要素を設定削除を呼び出して要素を除去する

2

すなわち:

import java.util.ArrayList; 
public class Test 
{ 
    public static void main(String[] args) 
{ 
     ArrayList<Double> a = new ArrayList<Double>(); 
     a.add(12.3); 
     a.add(15.3); 
     a.add(17.3); 

     a.set(1, null); 
     System.out.println(a.get(1)); 
    } 
} 
2

あなたはHashMap<Integer, Double>を使用することができます。あなたは

myMap.put(currentMaximumIndex++, myDoubleValue); 

この方法を使用してアイテムを追加することができ、インデックスはあなたが合理的に大丈夫だろうスパースストレージを必要とし、値を削除すると、既存のものを傷つけないならば、独特のだろう。

+0

+1。これは、値を格納し、インデックスを変更しない、最もスペース効率のよい方法です。 – eboix

1

追加。

関連する問題