0

私は非常に奇妙な問題を抱えており、非常に効率的な方法で解決したいと考えています。私のアプリではミリ秒がカウントされます..

私は4つArrayListsの弦を持っています

title desc, price, usageArray;

最初の 3 つにはデータが含まれており、usageArray にはデータが含まれており、いくつかの場所では「NONE」が含まれています。

UsageArray

a b c NONE D NONE

たとえば、最初の NONE のインデックスを 3 にすると、title、desc、price の 3 番目の要素も削除されるように、usageArray から「NONE」を削除したいと考えています。

これを非常に効率的な方法で行うにはどうすればよいですか

4

5 に答える 5

3

Bookまず、これらすべての属性を含むクラスを作成し、それらすべてList<Book>に対して 4 つの異なるリストを作成するのではなく、 を作成することをお勧めします。

PS :一般に、複数のリストを並行して変更または操作している場合は、新しいクラスを作成する時期であることを示しています。

class Book {
    String title;
    String desc;
    BigDecimal price;
    String usage;
}

次に、次のようなリストがあります。

List<Book> books;

ここで、 が であるすべてのインデックスを削除するにusageNULL、次のように簡単です。

ListIterator<Book> iterator = books.listIterator();

while (iterator.hasNext()) {
    Book book = iterator.next();
    if (book.getUsage().equals("NULL")) {
        iterator.remove();
    }
} 

"Null"また、文字列値として持っているところはどこでも、に変更することを検討する必要がありますnull

注: から要素を削除するときは注意が必要Listです。その際、常にイテレータを使用する必要があります。

以下も参照してください。

于 2013-06-30T17:42:24.887 に答える
0

これはテスト済みのコードです。パブリック クラス メインクラス {

public static void main(String ar[])
{

    List<Integer> indexes = new ArrayList<Integer>();


    List<String> title = new ArrayList<String>();
        title.add("title 1");
        title.add("title 2");
        title.add("title 3");
    List<String> desc = new ArrayList<String>();
        desc.add("desc 1");
        desc.add("desc 2");
        desc.add("desc 3");
    List<String> price = new ArrayList<String>();
        price.add("price 1");
        price.add("price 2");
        price.add("price 3");
    List<String> usageArray = new ArrayList<String>();
        usageArray.add("usage 1");
        usageArray.add("NONE");
        usageArray.add("usage 1");


    for (String string : usageArray) {

        if(string.equalsIgnoreCase("NONE"))
        {
            indexes.add(usageArray.indexOf(string));

        }

    }


    for (Integer index : indexes) {

        price.remove(index);
        desc.remove(index);
        title.remove(index);
        usageArray.remove(index);

    }

}

}

于 2013-06-30T17:52:03.297 に答える
0

これは(いつものように)依存します。データセットの大きさは? 基本的なアプローチをテストして、時間がかかりすぎることがわかりましたか? たとえば、単純な LinkedLists は、削除に関しては (ArrayList と比較して) より効率的です。どのような方法で高速に検索できるデータ構造を実現したいですか? インデックスで?鍵で?高速であるために何が必要ですか? 実際のフィルタリングですか、それとも完了した後ですか?

単純なケースでもこれを行う複数の方法。各列のフィールドを持つ 1 つのオブジェクトにマージするのはどうでしょうか。

class Data {
  String title;
  String desc;
  String price;
  String usage;
}

その後:

LinkedList<Data> allData = ...;

for (Iterator iter=allData.iterator();iter.hasNext();) {
  Data data = iter.next();
  if ("NONE".equals(data.usage)) { //see note about using something else here
    iter.remove();
  }
}
//allData is now cleaned of any entries with USAGE of NONE

通常は ArrayList を使用するよりも速く、複数のリストを使用するよりも確実に高速です。

たとえば、データ モデリングのニーズに応じて、別のクラスで使用したい場合があります。

アルゴリズムに関係なく、さらなるパフォーマンスを得るには (これは重要な部分なので、楽しみのためだけに、常に測定してください!)、次の点を考慮してください。

  • より効率的な比較のためにorを作成usageするか、文字列定数を作成する必要がないので、代わりに使用できますenumintequals()usage == NONE
于 2013-06-30T17:53:02.873 に答える
-1

次のコードを確認してください。

public static void main(String ar[])
{

    List<String> title = new ArrayList<String>();
        title.add("title 1");
        title.add("title 2");
        title.add("title 3");
    List<String> desc = new ArrayList<String>();
        desc.add("desc 1");
        desc.add("desc 2");
        desc.add("desc 3");
    List<String> price = new ArrayList<String>();
        price.add("price 1");
        price.add("price 2");
        price.add("price 3");
    List<String> usageArray = new ArrayList<String>();
        usageArray.add("usage 1");
        usageArray.add("NONE");
        usageArray.add("usage 1");


    int index = -1;
    for (String string : usageArray) {

        if(string.equalsIgnoreCase("NONE"))
        {
            index = usageArray.indexOf(string);
                    usageArray.remove(string);
                    price.remove(index);
                    desc.remove(index);
                    title.remove(index);

        }

    }





}
于 2013-06-30T17:34:54.427 に答える