2017-12-16 8 views
1

Java 6を使用すると、オブジェクトのリストに別のオブジェクトリストのフィールドが含まれているかどうかを知る良い方法はありますか?他のオブジェクトリストのフィールドに応じたオブジェクトのフィルタリスト

私は2つのforを使用して実装しましたが、これがパフォーマンスに影響するかどうかはわかりません。 Java 8にstreamsのようなJavaの機能はありますか?

public class Object1 { 
    private BigDecimal field1; 
    private String field2; 
    private String field3; 
} 
public class Object2 { 
    private BigDecimal field1; 
    private String field2; 
} 

List<Object1> list1 = new ArrayList<Object1>(); 
List<Object2> list2 = new ArrayList<Object2>(); 
List<Object1> listFilter = new ArrayList<Object1>(); 
for (Object object1 : list1) { 
    for (Object object2 : list2) { 
     if(object1.getField1().compareTo(object2.getField1())==0) { 
      listFilter.add(object1); 
      break; 
     } 
    } 
} 
+0

_ "Java 6を使用する" _ - なぜJavaのバージョンが古くなっているのですか? –

+0

お客様の要件... @JimGarrison – ddepablo

答えて

0

あなたコード:

for (Object object1 : list1) { 
    for (Object object2 : list2) { 
     if(object1.getField1().compareTo(object2.getField1())==0) { 
      listFilter.add(object1); 
      break; 
     } 
    } 
} 

これはO(N )時間複雑。あなたは

// Build a Set of unique Object2.field1 values 
Set<BigDecimal> o2f1set = new HashSet<BigDecimal>(); 
for (Object2 o2 : list2) 
    o2f1Set.add(o2.getField1); 

// Select Object1 instances whose field1 value matches any 
// field1 value that was in list2 
for (Object1 o1 : list1) 
    if (o2f1Set.contains(o1.getField1()) 
     listFilter.add(o1); 

は、このコースのfield1のクラスが適切にBigDecimalが行うれ、equals()hashCode()を実装することを前提とし、その後有無をチェックすると、O(n)は、最初のSet<?>Object2.field1値を入れる必要があります。

可能field1値の範囲は強く有界と比較的小さく、整数の場合(つまり、あなたの要件とモデルの制限の範囲に値、0..1000を言う)、あなたの代わりにセットのboolean配列を使用してこれを最適化することができます。非常に限られた状況では、これによりパフォーマンスがさらに向上します。

+0

私は質問の中でBigDecimalとしてflied1の型を定義しました – ddepablo

関連する問題