Java 查找对象列表是否包含具有指定字段值的内容?
我有一个从DB接收的DTO列表,它们有一个ID。我想确保我的列表包含一个具有指定ID的对象。显然,在这种情况下创建一个具有预期字段的对象不会有帮助,因为contains()调用object.equals(),并且它们不会相等 我想出了这样一个解决方案:创建一个接口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
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);
...
}