0

機能している問題ステートメントがありますが、以下のシナリオを処理するために、より効率的で、より速く、さらに重要なことに正しく設計されていることを知りたいです。

私はPOJOクラスを持っています

class A {
  String s;
  Double d;
}

リスト、基本的にはオブジェクト A のリストをリストに入力しようとしています。今問題の実装。オブジェクト A をリストに追加するときに、 String を持つオブジェクトが既に存在するかどうかを確認する必要があります。はいの場合、古いオブジェクトを古い d1 + 新しい d1 で更新し、新しいオブジェクトをリストに追加しない場合、新しいオブジェクトをリストに追加します。私の現在の実装は以下のようなものです。

double dd = 0.0;
    List<A> aList = new List<A>();
    List<A> aListToRemove = new List<A>();
    A newA = null;
    for(int i=0;i<=100;i++ ){
        newA = method call which returns newA;
        for(A oldA: aList ){
            if(oldA.getS().equals(newA.getS())){
                dd = oldA.getD() + newA.getD();
                newA.setD(dd);
                aListToRemove.add(oldA);
            }
            aList.add(newA);
            aList.removeAll(aListToRemove);
        }
    }

//at the end, i would like to see aList with no duplicates, but with updated d value.

2 番目の for ループ内で処理を行うためのより効率的な方法はありますか?

4

6 に答える 6

2

ユースケースにマップを使用できるようです:

Map<String, A> map = new HashMap<> ();

次のようにアイテムをマップに配置します。

map.put(someA.s, someA);

これにより、 O(n^2) アルゴリズムが O(n) アルゴリズムに変わります。

を受け取ったらnewA、以下を使用できます。

A a = map.get(newA.getS());
if (a == null) {
    map.put(newA.getS(), newA); //new string => new item in the map
} else {
    a.setD(a.getD() + newA.getD()); //found string => updating the existing item
}
于 2013-01-03T11:16:28.640 に答える
1

マップの使用を検討してください。getメソッドを使用して、アイテムがマップ内にあるかどうかを確認できます(sがキーになるようです)。

A a = myMap.get(newA.getS());
if (a != null){
 a.setD(a.getD() + newA.getD());
} else {
 myMap.put(newA);
}
于 2013-01-03T11:19:40.653 に答える
1

の使用を検討する必要がありMapます。

于 2013-01-03T11:16:04.677 に答える
1

である必要がありListますか?Mapあなたのために仕事をすることができるように聞こえます。具体的には、このput()操作は、セマンティクスに完全に適合するキーと値のペアを追加または置換します。

乾杯、

于 2013-01-03T11:16:30.800 に答える
1

効率が必要な場合は、MultiMapを使用するかMap<String, List<String>>、検索だけでなくデータの蓄積をより効率的に実行できます。文字列を一緒に追加する必要がある場合、最良のオプションはMap<String, double[]>

class A {
  String s;
  double d; // don't use Double unless you need null values.
}

Map<String, double[]> map = new LinkedHashMap<>();

for(A newA: getAs()) {
    double[] total = map.get(newA.getS());
    if (total== null)
        map.put(newA.getS(), total = new double[0]);
    total[0] += newA.getD();
}

これにより、O(1) ルックアップが提供され、最小限のオブジェクト作成で値が蓄積されます。

于 2013-01-03T11:16:46.240 に答える
0

操作にはを使用する必要がありjava.util.Setます。

O(1)時間でオブジェクトの存在を確認し、それに応じて操作を実行できます。

また、重複の削除も処理します。

   double dd = 0.0;
    Set<A> aList = new HashSet<A>();
    A newA = null;
    for(int i=0;i<=100;i++ ){
        newA = //method call which returns newA;
        A oldA = aList.get(newA);
        if(oldA != null){
           aList.remove(oldA);
        }
        dd = oldA.getD() + newA.getD();
        newA.setD(dd);
        aList.add(newA);
    }

必ずデフォルトの実装が使用されるクラスAのメソッドequalsとメソッドをオーバーライドしてください。hashcode()Set

于 2013-01-03T11:18:24.463 に答える