2017-12-16 1 views
1

Java 6을 사용하면 개체 목록에 다른 개체 목록 필드가 있는지 여부를 쉽게 알 수 있습니까?다른 개체 목록의 필드에 따라 개체 목록 필터링

두 개의 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 2) 시간 복잡도. 당신은

// 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

관련 문제