Java 使用';包含';类数组中的方法
我有一门课是这样的:Java 使用';包含';类数组中的方法,java,arrays,Java,Arrays,我有一门课是这样的: public static class TiposDeHistorial { String CODIGO, TIPO; public TiposDeHistorial() { } public String getCODIGO() { return CODIGO; } public void setCODIGO(String CODIGO) { this.CODIG
public static class TiposDeHistorial
{
String CODIGO, TIPO;
public TiposDeHistorial()
{
}
public String getCODIGO()
{
return CODIGO;
}
public void setCODIGO(String CODIGO)
{
this.CODIGO = CODIGO;
}
public String getTIPO()
{
return TIPO;
}
public void setTIPO(String TIPO)
{
this.TIPO = TIPO;
}
}
和一份清单:
ArrayList<TiposDeHistorial> tiposHistorial;
arraylisttiposhistorial;
因此,我的问题是:我是否可以使用
tiposHistorial.contains(…)
在特定数组字段中搜索,CODIGO
或TIPO
,例如?如果您使用的是Java 8,则可以使用以下代码:
tiposHistorial.stream()
.filter(x -> "specific value for CODIGO".equals(x.getCODIGO()))
.findFirst()
.orElse(null);
它将返回列表中包含特定CODIGO值的TiposDeHistorial对象,否则返回null
至于您的问题:“contains”方法只返回“true”或“false”,而不是对象。此外,它使用对象的“equals”方法,因此如果您想使用字段进行搜索,它将不会有帮助。首先,您没有
数组,而是数组列表
列表中的包含方法
与存储元素的等于方法一起操作(TiposDeHistorial
)。因此,你的问题的答案是否定的
尝试类似于TipostHistorial.contains(“a”)
的操作将不起作用,因为存在类型不匹配:当您尝试检查String
contains的元素时,列表的类型为TiposdHistorial
,只有当您的对象与您的list elements对象相等时,方法才会返回true。
您可以尝试扩展equals方法,并拥有自己的标准,可以用于CODIGO或TIPO
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
test other = (test) obj;
if (CODIGO == null) {
if (other.CODIGO != null)
return false;
} else if (!CODIGO.equals(other.CODIGO))
return false;
return true;
}
这里已经给出的答案都是正确的,只是如果您不了解java streams,并且希望检查列表是否同时包含一些CODIGO和TIPO字段,对我来说,最简单的解决方案是:
ArrayList<TiposDeHistorial> tiposHistorial = new ArrayList<>();
//add elements to the list
String tipo = "TIPO"; // the TIPO value You are looking for in the list
String codigo = "CODIGO"; // the CODIGO value You are looking for in the list
boolean containsTipo = false;
boolean containsCodigo = false;
for (TiposDeHistorial element: tiposHistorial) {
if (!containsTipo && element.getTIPO().equals(tipo)) {
containsTipo = true;
}
if (!containsCodigo && element.getCODIGO().equals(codigo) ){
containsCodigo = true;
}
if (containsTipo && containsCodigo)
break;
}
ArrayList tiposHistorial=new ArrayList();
//向列表中添加元素
字符串tipo=“tipo”//您在列表中查找的TIPO值
字符串codigo=“codigo”//您在列表中查找的CODIGO值
布尔containsTipo=false;
布尔containsCodigo=false;
for(TiposDeHistorial元素:tiposHistorial){
如果(!containsTipo&&element.getTIPO().equals(tipo)){
containsTipo=真;
}
如果(!containsDigo&&element.getCODIGO().equals(codigo)){
containsCodigo=真;
}
if(containsTipo&&containsCodigo)
打破
}
通过稍微编辑它,您还可以找到数组中的哪些元素包含您要查找的值,如果这是您的意图的话您尝试过吗?发生了什么事?嗯,不是真的,因为如果我做了类似于tiposHistorial.contains(“a”)
的事情,编译器如何知道我指的是哪一个类字段?[O/T]:请熟悉。变量名应该用小写字母书写,或者更确切地说是用驼峰大小写。另一方面,常量(static final
)应全部命名为大写。小提示,请尝试始终使用英语编码。也就是说,使用英语类名、变量名等等。在您的问题中,这不会导致任何问题,但在更为电子化的问题中,这可能会导致人们无法轻松理解您试图实现的目标。对于包含,您应该使用tiposHistorial.stream().anyMatch(谓词)代码>我知道“anyMatch”,但Mazinger希望“在特定数组字段中搜索”,即不是元素确实存在的事实,而是该元素本身。在我阅读时,他想测试列表中是否有一个实例在字段“codigo”或“tipo”中具有特定值。我认为他还不想成为目标。因此,anyMatch
确实做到了这一点:boolean containsDigo=tiposHistorial.stream().anyMatch(t->“”.equals(t.getCODIGO())代码>1),但这样您就必须有一个TiposDeHistorial
的实例,该实例必须具有所需的CODIGO
值才能使用.contains(templateTipo)
。你不能简单地测试一个'codigo':.contains(“”
2)你只能为一个“身份”实现equals
,你不能有不同的逻辑:codigo
或TIPO
3)你还应该提到,如果你实现equals()
你还必须实现'hashCode()'。你绝对正确,但是您也可以给出一些关于替代解决方案的提示,例如对于每个公共集合(CollectionUtils.find(…)
)或Java 8流:boolean containsCodigo=tiposHistorial.stream().anyMatch(t->“”.equals(t.getCODIGO())代码>首先,感谢大家的回答。Jacobek,事实上,我做的与你的建议非常相似,使用了foreach,但我想知道是否有一种方法可以在一行简单的代码中完成,比如.contains
@Mazinger如果你使用的是Java 8,那么你可以在一行代码中使用Streams API:boolean contains=tiposHistorial.stream().anyMatch(t->“”.equals(t.getCODIGO())&&&.equals(t.getTIPO());
OK@Markus,你的建议很有意思,不管怎样,我想找一个较短的表达式,但你的表达式也很好。谢谢!