2017-02-07 111 views
1

考慮我有一個List對象中的對象,我將其轉換爲一個集做出一些動作是這樣的:檢查是否設置對象的包含與此屬性

List<User> listUser = new ArrayList<>(); 
listUser.add(new User(1, "user1")); 
listUser.add(new User(2, "user2")); 
listUser.add(new User(3, "user3")); 

Set<User> myset = new HashSet<>(listUser); 

我知道有一個contains(Object o)但我想檢查我的對象的屬性。

我的問題是什麼是最好的方式,以檢查是否設置包含一個對象與ID = 1user = "user1"或任何屬性

謝謝。

+0

那麼你需要使用地圖,而不是設置,把ID作爲關鍵,你的對象作爲價值 – subash

+0

我可以檢查用戶名或ID或任何屬性不只是ID,這只是和示例@subash –

+1

如果你想爲了嘗試一些真正喜歡的東西,您可以利用[Java 8的Stream](https://docs.oracle.com/javase/tutorial/collections/streams/)支持,基本上,我會根據您的需要過濾集合評論和看看你最終結果 – MadProgrammer

回答

4

User類重寫equals方法?如果是這樣,你可以使用:

if (mySet.contains(new User(1, "irrelevant")); 

請注意,這是相當奇怪,有一些所謂mySet這實際上是一個List而非Set ......我會考慮任何更改名稱或類型。如果您使用HashSet,則需要覆蓋hashCode以及equals,但無論如何您都應該這樣做,以遵守Object的正常合同。

如果您希望能夠通過多個不同的屬性進行檢查 - 或者如果您不想在User中覆蓋相等,那麼您可以考慮創建地圖,例如,

Map<Integer, User> usersById = new HashMap<>(); 
Map<String, User> usersByName = new HashMap<>(); 
... 

然後,你需要保持所有同步過程中的地圖, - 你需要考慮,如果你有多個用戶使用相同的名稱發生什麼事,等

+1

如果他將類型更改爲List,他可以使用list.stream()。anyMatch(...)',不是嗎? – qwerty1423

+0

謝謝你的幫助,我很感激:) –

+0

@ qwerty1423,首先,他不需要一個列表來使用一個流,也可以用一個集合來完成。其次,更重要的是,他說他使用Java 7,所以他根本不能使用流(直到他升級)。 –

1

我認爲最簡單最有趣的方式是通過考慮id來覆蓋User類中的equals方法。

然後你可以使用包含僅使用ID List接口

+1

也記得實現'equals'和'hashCode'(等價「合同」) – vikingsteve

1

你是正確的您不能在Java 7中使用Java流(它們是在Java 8中引入的)。對於Java 7,我會建議使用增強for循環來檢查搜索條件(if (u.getId() == 1))並採取適當的行動。允許查找由IDHashMap<String, User>用於查找用戶名HashMap<Integer, User>

如果你曾經獲得與線性搜索的問題,即for循環會做,你可以建立地圖。 Map.containsKey()會告訴你地圖是否包含特定用戶。你需要注意地圖包含所有的用戶,當用戶從你的設置/列表中刪除時,他們也會從地圖中刪除,當然(哎呀,現在只能看到Jon Skeet已經說了所有這些,對不起)。

對於任何使用Java 8並在此處閱讀的人來說,使用流不需要很花哨。幾個例子:

boolean containsUser1 = myset.stream().anyMatch(u -> u.getId() == 1); 

This yieds true

User[] u1Array = myset.stream().filter(u -> u.getId() == 1).toArray(User[]::new); 
    Set<User> u1Set = myset.stream().filter(u -> u.getUserName().equals("user1")).collect(Collectors.toSet()); 

每個這兩個產量[1 user1]的(第一個作爲數組,第二爲s Set,很明顯)。流的每次使用都在幕後進行線性搜索。

這就是說,你可以與流做花哨的事情。我很高興瞭解它們並使用它們,期待這一點。

相關問題