检查 arraylist 对象是否存在
Checking if arraylist object exists
嗯,我的问题是这样的。
My class Message contains:
- id
- message
- [User]
My class User contains:
- id
- name
这是我向 arrayList 添加信息的方式:http://pastebin.com/99ZhFASm
我有一个包含 id、消息、用户的 arrayList。
我想知道我的arrayList是否已经包含"user"
的id
注意:已尝试使用 arraylist.contains
(Android)
因为你的对象 Message
具有唯一标识符 (id
),所以不要将它放在 ArrayList
中,请使用 HashMap
或 HashSet
.但首先,您需要在该对象中创建方法 equal() 和 hashCode():
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Message message = (Message) o;
return id == message.id;
}
@Override
public int hashCode() {
return id;
}
这样就可以发挥map和set的优势了。所以,这样做:
User user = new User();
user.setId(1);
user.setName("stackover");
Message msg = new Message();
msg.setid(10);
msg.setmessage("hi");
msg.setUser(user);
HashMap<Integer, Message> map = new HashMap<>();
map.add(new Integer(msg.getId()), msg);
boolean isItInMapById = map.containsKey(new Integer(10));
boolean isItInMapByObject = map.containsValue(msg);
如果您需要 ArrayList
条消息,只需执行以下操作:
ArrayList<Message> messages = new ArrayList<>(map.values());
如果需要,您还可以获取 ID 列表:
List<Set<Integer>> idList = Arrays.asList(map.keySet());
arrayList.stream().anyMatch(item.id == user.id)
如果您使用的是 Java 8,您可以编写如下代码:
ID theIdWeAreMatchingAgainst = /*Whatever it is*/;
boolean alreadyHasId =
list
.stream()
.anyMatch(m -> m.getId() == theIdWeAreMatchingAgainst);
如果您确实需要具有该 ID 的消息[-s],
Message[] msgs =
list
.stream()
.filter(m -> m.getId() == theIdWeAreMatchingAgainst)
.toArray(Message[]::new);
Message msg = msgs[0];
如果您使用的是 Java 7-,则必须使用旧方法:
public static List<Message> getMessage(ID id, List<Message> list) {
List<Message> filtered = new ArrayList<Message>();
for(Message msg : list) {
if(msg.getId() == theIdWeAreMatchingAgainst) filtered.add(msg);
}
return filtered;
}
所以你的问题和你的代码似乎并不一一对应。您有一个消息数组列表,其中消息包含一个 ID、一个消息字符串和一个用户对象。您正在为该消息应用一个 ID,并为用户应用另一个 ID。您想确保 ArrayList 与 ID 匹配,有两种方法可以做到这一点。
你可以这样做
boolean matchMessageId = true;
int idToMatch = [some_id];
for(Message message : arrayList){
int currId = matchMessageId? mesage.id: message.user.id;
if(currId == idToMatch){
return true;
}
}
return false;
然而,这似乎更适合 HashMap 或 SparseArray 之类的东西。
嗯,我的问题是这样的。
My class Message contains: - id - message - [User]
My class User contains: - id - name
这是我向 arrayList 添加信息的方式:http://pastebin.com/99ZhFASm
我有一个包含 id、消息、用户的 arrayList。
我想知道我的arrayList是否已经包含"user"
的id注意:已尝试使用 arraylist.contains
(Android)
因为你的对象 Message
具有唯一标识符 (id
),所以不要将它放在 ArrayList
中,请使用 HashMap
或 HashSet
.但首先,您需要在该对象中创建方法 equal() 和 hashCode():
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Message message = (Message) o;
return id == message.id;
}
@Override
public int hashCode() {
return id;
}
这样就可以发挥map和set的优势了。所以,这样做:
User user = new User();
user.setId(1);
user.setName("stackover");
Message msg = new Message();
msg.setid(10);
msg.setmessage("hi");
msg.setUser(user);
HashMap<Integer, Message> map = new HashMap<>();
map.add(new Integer(msg.getId()), msg);
boolean isItInMapById = map.containsKey(new Integer(10));
boolean isItInMapByObject = map.containsValue(msg);
如果您需要 ArrayList
条消息,只需执行以下操作:
ArrayList<Message> messages = new ArrayList<>(map.values());
如果需要,您还可以获取 ID 列表:
List<Set<Integer>> idList = Arrays.asList(map.keySet());
arrayList.stream().anyMatch(item.id == user.id)
如果您使用的是 Java 8,您可以编写如下代码:
ID theIdWeAreMatchingAgainst = /*Whatever it is*/;
boolean alreadyHasId =
list
.stream()
.anyMatch(m -> m.getId() == theIdWeAreMatchingAgainst);
如果您确实需要具有该 ID 的消息[-s],
Message[] msgs =
list
.stream()
.filter(m -> m.getId() == theIdWeAreMatchingAgainst)
.toArray(Message[]::new);
Message msg = msgs[0];
如果您使用的是 Java 7-,则必须使用旧方法:
public static List<Message> getMessage(ID id, List<Message> list) {
List<Message> filtered = new ArrayList<Message>();
for(Message msg : list) {
if(msg.getId() == theIdWeAreMatchingAgainst) filtered.add(msg);
}
return filtered;
}
所以你的问题和你的代码似乎并不一一对应。您有一个消息数组列表,其中消息包含一个 ID、一个消息字符串和一个用户对象。您正在为该消息应用一个 ID,并为用户应用另一个 ID。您想确保 ArrayList 与 ID 匹配,有两种方法可以做到这一点。
你可以这样做
boolean matchMessageId = true;
int idToMatch = [some_id];
for(Message message : arrayList){
int currId = matchMessageId? mesage.id: message.user.id;
if(currId == idToMatch){
return true;
}
}
return false;
然而,这似乎更适合 HashMap 或 SparseArray 之类的东西。