简体   繁体   English

Java 从属性比较两个 Object 列表

[英]Java compare two List of Object from attributes

Hello I have two List of object like this:您好,我有两个这样的 object 列表:

List<RoomEntity> RoomsList1 = getAllRooms1();
List<RoomEntity> RoomsList2 = getAllRooms2();

These RoomEntity have an attribute call roomName.这些 RoomEntity 有一个名为 roomName 的属性。

I want to create a new List<RoomEntity> RoomsList3 with all the rooms of RoomsList1 which have the same name in RoomsList2.我想创建一个新的List<RoomEntity> RoomsList3 ,其中包含 RoomsList1 的所有房间,这些房间在 RoomsList2 中具有相同的名称。

I have a method called我有一个方法叫

.getRoomName()

Something like就像是

RoomsList1 = {RoomEntity[roomName:kitchen, size:10], RoomEntity[roomName:bedroom, size:8]}
RoomsList2 = {RoomEntity[roomName:kitchen, size:15], RoomEntity[roomName:livingroom, size:12]}

then然后

RoomsList3 = {RoomEntity[name:kitchen, size:10]}

I hope this is clear.我希望这是清楚的。

Thanks for your answers.感谢您的回答。

You can use Stream您可以使用Stream

Like喜欢

List<room> list3 = list1.stream().filter(room -> 
list2.stream().anyMatch(room1 ->room1.roomName.equals(room.roomName)))
.collect(Collectors.toList());

If you're not familiar with stream, I'll explain:如果你不熟悉 stream,我会解释一下:

First step is filtering the first list it is like an iterator that will say if you want this iteration or not.第一步是过滤第一个列表,它就像一个迭代器,它会告诉你是否需要这个迭代。 (.filter()) (。筛选())

Second step is looking in the second list if there is a match for an expression (here if room's name from the first list equals any room's name from the second list).第二步是在第二个列表中查找是否存在表达式的匹配项(这里如果第一个列表中的房间名称等于第二个列表中的任何房间名称)。 (.anymatch()) (.anymatch())

Third and last step is to collect the result.第三步也是最后一步是收集结果。 (.Collectors.toList()) (.Collectors.toList())

It can be solved in two ways:可以通过两种方式解决:

Method 1方法一

        List<RoomEntity> roomEntities1 = Arrays.asList(new RoomEntity("kitchen", 10), new RoomEntity("bedroom", 8));
        List<RoomEntity> roomEntities2 = Arrays.asList(new RoomEntity("kitchen", 12), new RoomEntity("livingroom", 12));
        ArrayList<RoomEntity> roomEntities3 = new ArrayList<>();
        for (RoomEntity roomEntity : roomEntities1) {
            for (RoomEntity entity : roomEntities2) {
                if (entity.getRoomName().equals(roomEntity.getRoomName())) {
                    roomEntities3.add(roomEntity);
                    break;
                }
            }
        }

Method 2方法二

        List<RoomEntity> roomEntities1 = Arrays.asList(new RoomEntity("kitchen", 10), new RoomEntity("bedroom", 8));
        List<RoomEntity> roomEntities2 = Arrays.asList(new RoomEntity("kitchen", 12), new RoomEntity("livingroom", 12));
        ArrayList<RoomEntity> roomEntities3 = new ArrayList<>();
        HashSet<String> roomNames = new HashSet<>(); // to store all the room name of roomEntities2
        for (RoomEntity roomEntity : roomEntities2) {
            roomNames.add(roomEntity.getRoomName());
        }
        for (RoomEntity roomEntity : roomEntities1) {
            if (roomNames.contains(roomEntity.getRoomName())) {
                roomEntities3.add(roomEntity);
            }
        }

Note: Method 2 is more efficient on time but requires extra space.注意:方法 2 在时间上更有效,但需要额外的空间。

    Set<String> setName = new HashSet<>();
    RoomEntity2.forEach(entity -> setName.add(entity.getRoomName()));
    List<RoomEntity> RoomEntity3 = new ArrayList<>();
    RoomEntity1.forEach(entity -> {
        if (setName.contains(entity.getRoomName()))
            RoomEntity3.add(entity);
    });

With the proper RoomEntity implementation ( hashCode and equals implemented for roomName ), you can reduce the code way more.通过正确的RoomEntity实现(为roomName实现的hashCodeequals ),您可以进一步减少代码。 All you really need is:您真正需要的是:

List<RoomEntity> rooms1 = new ArrayList<>();
List<RoomEntity> rooms2 = new ArrayList<>();
rooms1.retainAll(rooms2);

#retainAll() keeps only the entities which are present in both lists. #retainAll()只保留两个列表中都存在的实体。 It compares entities using the equals() method.它使用equals()方法比较实体。

Here is a full example code:这是一个完整的示例代码:

public class Test {

    public static void main(String[] args) throws ParseException {
        List<RoomEntity> rooms1 = new ArrayList<>();
        List<RoomEntity> rooms2 = new ArrayList<>();
        List<RoomEntity> rooms3 = new ArrayList<>();

        Collections.copy(rooms3, rooms1); // only necessary if you don't want to change rooms1
        rooms1.retainAll(rooms2);
    }

}

class RoomEntity {
    private String roomName;

    public String getRoomName() {
        return roomName;
    }

    public void setRoomName(String roomName) {
        this.roomName = roomName;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((roomName == null) ? 0 : roomName.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        RoomEntity other = (RoomEntity) obj;
        if (roomName == null) {
            if (other.roomName != null)
                return false;
        } else if (!roomName.equals(other.roomName))
            return false;
        return true;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM