Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找对象列表是否包含具有指定字段值的内容?_Java_List_Object_Arraylist_Contains - Fatal编程技术网

Java 查找对象列表是否包含具有指定字段值的内容?

Java 查找对象列表是否包含具有指定字段值的内容?,java,list,object,arraylist,contains,Java,List,Object,Arraylist,Contains,我有一个从DB接收的DTO列表,它们有一个ID。我想确保我的列表包含一个具有指定ID的对象。显然,在这种情况下创建一个具有预期字段的对象不会有帮助,因为contains()调用object.equals(),并且它们不会相等 我想出了这样一个解决方案:创建一个接口HasId,在我所有的DTO中实现它,并用一个新类继承ArrayList,该类具有contains(Long id)方法 public interface HasId { void setId(Long id); Lon

我有一个从DB接收的DTO列表,它们有一个ID。我想确保我的列表包含一个具有指定ID的对象。显然,在这种情况下创建一个具有预期字段的对象不会有帮助,因为contains()调用object.equals(),并且它们不会相等

我想出了这样一个解决方案:创建一个接口
HasId
,在我所有的DTO中实现它,并用一个新类继承ArrayList,该类具有
contains(Long id)
方法

public interface HasId {
    void setId(Long id);
    Long getId();
}

public class SearchableList<T extends HasId> extends ArrayList<T> {
    public boolean contains(Long id) {
        for (T o : this) {
            if (o.getId() == id)
                return true;
        }
        return false;
    }
}

我建议创建简单的静态方法,就像您写的那样,不需要任何额外的接口:

public static boolean containsId(List<DTO> list, long id) {
    for (DTO object : list) {
        if (object.getId() == id) {
            return true;
        }
    }
    return false;
}
public静态布尔containsId(列表,长id){
for(DTO对象:列表){
if(object.getId()==id){
返回true;
}
}
返回false;
}

嗯,我认为你的方法有点把问题复杂化了。 你说:

我有一个从DB收到的DTO列表,它们有一个ID

那么您可能应该使用DTO类来保存这些项。如果是这样,请将id getter和setter放在该类中:

public class DTO implements HasId{
    void setId(Long id);
    Long getId();
}
这就足够遍历和ArrayList并搜索所需的id了。 仅为添加“compare id”feautre而扩展ArrayList类对我来说似乎过于复杂了@尼基塔·贝洛格拉佐夫就是一个很好的例子。你可以更概括地说:

public boolean containsId(List<HasId> list, long id) {
    for (HasId object : list) {
        if (object.getId() == id) {
            return true;
        }
    }
    return false;
}
public boolean containsId(列表,长id){
for(HasId对象:列表){
if(object.getId()==id){
返回true;
}
}
返回false;
}

我建议您只需覆盖
可搜索数据中的
equals
,它将类似于:

public boolean equals(Object o){
    if (o instanceof SearchableDto){
        SearchableDto temp = (SearchableDto)o;
        if (this.id.equals(temp.getId()))
            return true;
    }
    return false;
}

在这种情况下,
包含
如果具有相同的
id
,则可能会起作用

我不清楚你的要求。当您说“确保我的列表包含具有指定ID的对象”时,是否要:

  • 检测ID是否存在,并相应地采取行动
  • 在结果中始终包含具有所需ID的DTO
  • 大多数回答都假设你的意思是1,但是考虑到问题的措辞,你也可以是2。您可以通过更改查询来包含所需的结果:

    SELECT * FROM employee WHERE firstname = 'John' OR id = 42;
    
    public boolean containsId(列表,长id){
    布尔标志=假;
    for(HasId对象:列表){
    if(object.getId()==id){
    flag=true;
    }
    }
    返回标志;
    }
    
    这是我在DFS GetUnvisitedNeighbor函数中使用的

        public static int GetUnvisitedNeighbour(int v)
    {
        Vertex vertex = VertexList.stream().filter(c -> c.Data == v).findFirst().get();
        int position = VertexList.indexOf(vertex);
        ...
    }
    
    我过去在C#工作。C#中的Lambda表达式比Java中的更易于使用

    您可以使用
    filter
    函数为元素的属性添加条件


    然后根据你的逻辑使用
    findFirst().get()
    findAny.get()

    我肯定你的意思是“发明轮子”。为什么不搜索一个列表呢?尼山,这正是我的意思,这是一个翻译问题:D Ray Tayek,哇,这么简单而优雅的想法我都没有想到,我一定会尝试一下,谢谢你我不确定我是否可以将列表按列表进行类型转换谢谢你使用anyMatch()方法进行编辑。这是一个测试语句,我想确保我的Hibernate代码正确地进行了映射,并从数据库中提取了正确的值。如果这是一个特定的测试用例,那么为什么不循环检索到的对象,如果找不到所需的ID,则测试失败呢?为什么所有DTO都要为此实现HasId接口?为了更好的代码可读性,我将从for和if中删除括号。在我看来,这是一种很好的做法。无论如何,谢谢你的这个方法!嗯,就性能而言,这不是最好的选择,我认为@medopal的解决方案是better@Choletski这里的性能有什么问题?假设我们不使用并行计算,你不能比O(N)做得更好。最好在标志值为真时,为每个
    循环中断
    ,而不是循环到结束
    
       public boolean containsId(List<HasId> list, long id) {
        boolean flag = false;
        for (HasId object : list) {
            if (object.getId() == id) {
               flag = true;
            }
        }
        return flag;
    }
    
        public static int GetUnvisitedNeighbour(int v)
    {
        Vertex vertex = VertexList.stream().filter(c -> c.Data == v).findFirst().get();
        int position = VertexList.indexOf(vertex);
        ...
    }