2014-01-24 33 views
-1

假設你必須裝滿狗......我們想知道一個月後狗失去了多少重量。所以一些代碼在這裏:如何以優雅的方式在Java中找到兩個相等的對象? (循環套裝)

Set<Dog> dogsJanuary = getDogsInJanuaryFromDB(); 
Set<Dog> dogsFebruary = getDogsInFebruaryFromDB(); 

現在我需要遍歷所有的狗對象,看看狗是否已經減肥。我是這樣做的:

for(Dog d:dogsJanuary) 
    for(Dog g:dogsFebruary) 
     if(d.equals(g)) // Assume dog name is unique and equals check if name.equals(name) 
      boolean dogLostWeight = compareDogs(d,g) 

有沒有更好的辦法?

+0

爲什麼downvoted,downvoter? –

回答

2

Sets.intersection來自番石榴庫。

編輯,再利用musical_coder地圖的想法和狗名作爲關鍵字:

package com.stackoverflow.so21326160; 

import com.google.common.base.Function; 
import com.google.common.collect.Maps; 
import com.google.common.collect.Sets; 

import java.util.Iterator; 
import java.util.Map; 
import java.util.Set; 

import lombok.Data; 
import lombok.EqualsAndHashCode; 

public class App { 

    public static void main(final String[] args) 
    { 
     final Map<String, Dog> dogsJanuary = Maps.uniqueIndex(getDogsInJanuaryFromDB(), ToName.INSTANCE); 
     final Map<String, Dog> dogsFebruary = Maps.uniqueIndex(getDogsInFebruaryFromDB(), ToName.INSTANCE); 

     final Set<String> commonDogNames = Sets.intersection(dogsJanuary.keySet(), dogsFebruary.keySet()); 
     for (final String commonDogName : commonDogNames) { 
      final Dog january = dogsJanuary.get(commonDogName); 
      final Dog february = dogsFebruary.get(commonDogName); 
      // use the dogs 
     } 
    } 

    static enum ToName implements Function<Dog, String> { 
     INSTANCE; 

     @Override 
     public String apply(final Dog input) 
     { 
      return input == null ? null : input.getName(); 
     } 
    } 
} 
+1

這與我想要的相反。 –

+0

編輯修復它,對不起 – 2014-01-24 06:51:56

+0

你能提供一些細節嗎?我不完全明白我可以用Sets.SetView 十字路口做什麼? –

1

你不能沒有寫helper方法,或者使用端庫,將做幾乎同樣的簡化這段代碼是什麼你在這個代碼中做。

3

如果你有一個主鍵唯一標識數據庫中的每個Dog,使用Map避免內部for循環:

Map<int,Dog> dogsJanuary = getDogsInJanuaryFromDB(); 
Map<int,Dog> dogsFebruary = getDogsInFebruaryFromDB(); 

Iterator<Entry<int,Dog>> iter = dogsJanuary.entrySet().iterator(); 
while(iter.hasNext()) { 
    Entry<int,Dog> entry = iter.next(); 
    int dog_id = entry.key(); 
    Dog d = entry.value(); 
    Dog g = dogsFebruary.get(dog_id); 
    boolean dogLostWeight = compareDogs(d,g); 
} 
+0

我無法控制這個水平。 –

+0

+1爲地圖創意 – 2014-01-24 07:11:23

+0

即使您只能以Set方式獲取數據,您也可以迭代該設置並將其放入Map中。這需要線性時間。 –

2

可以減少循環的複雜性如果使用進一步一個有序集LinkedHashSet。有序集保證了集合中元素的順序。 這樣,您只需在所有元素上循環一次,並且您可以在給定索引(與訂單正在更改)之間比較兩個Dog,並查找等待中的差異。

0

如果您可以使用有序集合,並且getDogsInJanuaryFromDB()和getDogsInFebruaryFromDB()都返回相同的結果,那麼您可以通過一個循環並在其中執行操作。

0

在開始之前,您可以每個月都剪掉所有多餘的狗,以減少您必須做的比較次數。

Set<Dog> commonDogsJanuary = new HashSet<Dog>(dogsJanuary); 
commonDogsJanuary.retainAll(dogsFebruary); 

Set<Dog> commonDogsFebruary = new HashSet<Dog>(dogsFebruary); 
commonDogsFebruary.retainAll(dogsJanuary); 


for (Dog januaryDog : commonDogsJanuary) { 
    int januaryWeight = januaryDog.getWeight(); 
    for (Dog februaryDog : commonDogsFebruary) { 
     if (januaryDog.equals(februaryDog) && januaryWeight > februaryDog.getWeight()) { 
      // Do whatever 
     } 

    } 

}

相關問題