2016-02-19 81 views
0

基本上我有一種形式,我必須根據對象id選擇的公共字段值預先填充。例如。我有4個領域的對象(a,b,c,d,可能更多)。如果選擇了ids 1,2,3(可能超過3個)的對象,那麼我應該如何比較每個選定對象的所有字段,以便預先填充具有共同值的表單?比較共同值的n個對象的多個字段

我查看了Comparator類,但它看起來像它一次比較兩個對象(可能是多個字段),這意味着如果我選擇了n個對象,這可能意味着很多循環?

我也考慮做一個SQL選擇不同,然後基於返回的行數我會知道如果字段值是否相同。然而,這意味着我必須做出儘可能多的SQL不同的調用,因爲有領域這也聽起來很麻煩,以及我會做數據庫中的邏輯而不是應用程序的事實...

我是使用休眠,春天和Java所以我想知道如果我只是缺少一個功能,可以做類似的事情?

目前我使用的是類似

CollectionUtils.collect(objectList,TransformerUtils.invokerTransformer("getA")); 

,做它爲每個窗體域,然後檢查重複值的陣列,它似乎並不在最佳所有要麼...

任何幫助/提示將不勝感激!

+0

不清楚你想要做什麼。 「比較」和「預填充」如何結合在一起?您是否試圖在數據庫中以字段爲單位預填表格中最常見的值? – Andreas

+0

你可以編寫你自己的比較器,它有'n'方法作爲你需要比較的屬性數量。我認爲這是針對您的問題的簡單解決方案。不要忘記,如果你有'm'對象,那麼你將有'm'次驗證。 – aribeiro

+0

@Andreas是的,我試圖預填充表單,只有當所有選擇的對象都爲該字段保留相同的值(所以表單可能有一些預填充的值,併爲其他人留空)由於不清楚! – ec3

回答

0

這裏是一個辦法做到這一點使用Java 8流:

public class Test8 { 
    public static void main(String[] args) { 
     MyObj[] testData = { 
       new MyObj(1, "X", 3.14, "Larry"), 
       new MyObj(2, "X", 3.14, "Curly"), 
       new MyObj(3, "X", 3.14, "Moe"), 
     }; 
     System.out.println("A = " + findCommon(testData, MyObj::getA).orElse(null)); 
     System.out.println("B = " + findCommon(testData, MyObj::getB).orElse(null)); 
     System.out.println("C = " + findCommon(testData, MyObj::getC).orElse(null)); 
     System.out.println("D = " + findCommon(testData, MyObj::getD).orElse(null)); 
    } 
    private static <T, R> Optional<R> findCommon(T[] data, Function<? super T, ? extends R> getterMethod) { 
     Set<R> values = Arrays.stream(data) 
           .map(getterMethod) 
           .collect(Collectors.toSet()); 
     return (values.size() == 1 
       ? Optional.ofNullable(values.iterator().next()) 
       : Optional.empty()); 
    } 
} 
class MyObj { 
    private final int a; 
    private final String b; 
    private final double c; 
    private final String d; 
    MyObj(int a, String b, double c, String d) { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
     this.d = d; 
    } 
    public int getA() { 
     return this.a; 
    } 
    public String getB() { 
     return this.b; 
    } 
    public double getC() { 
     return this.c; 
    } 
    public String getD() { 
     return this.d; 
    } 
} 

輸出

A = null 
B = X 
C = 3.14 
D = null 

UPDATE

使用Set是一個簡單的解決方案,但它總是有t o掃描所有對象。

如果你有很多的對象,它可能是很好的性能爲您找到不同的值,一旦停止掃描:

private static <T, R> Optional<R> findCommon(T[] data, Function<? super T, ? extends R> getterMethod) { 
    R onlyValue = null; 
    for (T obj : data) { 
     R value = getterMethod.apply(obj); 
     if (value == null) 
      return Optional.empty(); 
     if (onlyValue == null) 
      onlyValue = value; 
     else if (! value.equals(onlyValue)) 
      return Optional.empty(); 
    } 
    return Optional.ofNullable(onlyValue); 
} 
+0

我認爲這可能完美/可能比我以前的方法更優化。除了流之外,它看起來像我們去類似的(我也使數組到一個集來檢查大小== 1)沒有讀取array.steam,但它是有益的,因爲我不需要爲每個字段實例化一個數組?將嘗試實施並報告。謝謝!! – ec3