2017-12-16 2 views
1

Wie kann man mit Java 6 besser wissen, ob eine Liste von Objekten ein Feld einer anderen Liste von Objekten enthält?Filterliste von Objekten abhängig vom Feld einer anderen Objektliste

Ich habe es mit zwei for implementiert, aber ich weiß nicht, ob dies die Leistung beeinträchtigt. Gibt es Java-Funktionen wie streams in Java 8?

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

_ "Verwenden von Java 6" _ - Warum verwenden Sie eine Java-Version, die längst am Ende des Lebens liegt? –

+0

Kundenanforderung ... @JimGarrison – ddepablo

Antwort

0

Ihr Code:

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

Dies ist O (n) Zeitkomplexität. Sie sollten die Object2.field1 Werte in eine Set<?> die erste Stelle setzen, dann auf die Existenz Überprüfung ist 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); 

Dies setzt natürlich voraus, dass die Klasse von field1equals() richtig implementieren und hashCode(), die BigDecimal tut.

Wenn der Bereich möglicher field1 Werte integer ist, stark begrenzt und relativ klein ist (das heißt Ihre Anforderungen und Modellgrenze die Werte auf einen Bereich, sagen 0..1000), könnten Sie diese optimieren, indem eine boolean Array anstelle eines Satzes verwenden. Unter diesen sehr begrenzten Umständen würde dies die Leistung noch mehr verbessern.

+0

Ich habe den Typ von flied1 als BigDecimal in meiner Frage definiert – ddepablo

Verwandte Themen