2017-11-10 17 views
0

値に基づいてリストをフィルタリングしようとしています。私は2つを持っていますList。 1つは削除したい名前のリスト、つまりanimalListにあります。そしてもう1つは、animalListの名前に一致するオブジェクトを削除する必要があるので、メインのプライマリリストからです。今私は解決策を持っているが、私はそれが多くの時間がかかると思う。以下はコードです。私はJava 8を使用しています。最適化できますか?Java - 複数の値に基づいてリストをフィルタリングする

if(animalList!=null && animalList.size()>0) 
     { 
      for(AnimalFilterPojo dtoObject:animalList) 
      { 
       if(!dtoObject.getApproved()) 
       { 
        for(AnimalPrimaryDataPojo mainDtoObject: AnimalPrimaryDataPojoFilterList) 
        { 
         if(mainDtoObject.getAnimalName().equalsIgnoreCase(dtoObject.getValue())) 
         { 
          AnimalPrimaryDataPojoFilterList.remove(mainDtoObject); 
         } 
        } 
       } 
      } 
+1

反復処理中にリストから要素を削除するには、反復子を手動でインスタンス化し、iterator.remove()を使用するか、[this problem](https:// stackoverflow)が必要です。 .com/questions/16965484/java-util-concurrentmodificationexception-iterator/16965558)を参照してください。 もっと良い解決策は 'stream()'、 'filter()'、 'collect(Collectors.toList())'を使うことです。 –

+0

最適化されたものは何ですか?速度?ブレースの量?このコードはおそらくより大きな設計問題の兆候であるため、ストリームを使用するように変換しても実際には役に立ちません。あなたの命名は、クラス名の末尾に 'Pojo'を追加することは、特に変数名として' dtoObject'を使うときには、とても不器用です。 – Kayaman

答えて

2

removeAll()メソッドを使用してください。

AnimalPrimaryDataPojoFilterList.removeAll(animalList); 

それはNB

AnimalPrimaryDataPojoFilterListから animalListのオブジェクトを削除します:あなたは場合、あなたの中にソースとして AnimalPrimaryDataPojoFilterListを使用し、その後 removeIfを使用することができます AnimalFilterPojo

+0

使用できません。両方のリストが異なっています。 AnimalPrimaryDataPojoFilterListにはanimalListのプロパティの1つがあります – sTg

+1

@sTg次に、 'AnimalPrimaryDataPojoFilterList.remove(dtoObject);をどのように書いていますか? 'AnimalPrimaryDataPojoFilterList.remove(mainDtoObject);でなければなりません。 –

0

hashCode()equals()メソッドを実装する必要がありますifブロック内であなたのロジックを反転させる必要があります。つまり、

if(animalList != null && animalList.size() > 0){ 
     AnimalPrimaryDataPojoFilterList.removeIf(x -> 
        animalList.parallelStream() 
        .filter(e -> !e.getApproved() && x.getAnimalName().equalsIgnoreCase(e.getValue())).findAny().orElse(null) != null); 
} 
0

Java 8ストリームを使用してリストをフィルタリングできます。以下の例では、ParentはString型のabcプロパティを持つオブジェクトです。コードを説明するために

if(animalList!=null && animalList.size()>0) 
    animalList.removeIf(animal -> 
     AnimalPrimaryDataPojoFilterList.stream() 
      .filter(filter -> !filter.getApproved()) 
      .map(AnimalFilter::getValue) 
      .collect(Collectors.toList()).contains(animal.getAnimalName())); 

:ここでは、受信ラムダあるPredicateを使用してオブジェクトを削除するにはリスト上のremoveIf()を使用する私たちは、あなたがこれを試すことができList<String> names

public class ListFilterDemo { 
    public static void main(String[] args) { 
     List<String> names = new ArrayList<>(); 
     List<Parent> objs = new ArrayList<>(); 

     List<Parent> filtersObjs = objs.parallelStream().filter((obj) -> names.contains(obj.getAbc())).collect(Collectors.toList()); 
    } 
} 

class Parent { 
    private String abc; 

    public Parent(String abc) { 
     this.abc = abc; 
    } 

    public String getAbc() { 
     return this.abc; 
    } 
} 
1

を使用してList<Parent> objsをフィルタリングしていますanimalを抽出し、名前で要素を削除してリストをフィルタリングします。ここで、nameは、を抽出して承認済みフラグ(第2のfilter)を持つelmentsのAnimalPrimaryDataPojoFilterListを選択して生成されたリスト(mapを使用)、Collectorを使用してリストを構成します。

部分:

AnimalPrimaryDataPojoFilterList.stream() 
    .filter(filter -> !filter.getApproved()) 
    .map(AnimalFilter::getValue) 
    .collect(Collectors.toList()) 

フィルタ

animalList.removeIf(animal -> 
    <generated list>.contains(animal.getAnimalName())); 

として使用するリストを生成し、フィルタを適用する代わりに、生成されたリストを使用します。 もちろんこれはあなたが持っているリストを変更することに注意してください さらに、AnimalPrimaryDataPojoFilterListの場合のように、大文字で変数を始めるべきではありません。

関連する問題