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,你的建议很有意思,不管怎样,我想找一个较短的表达式,但你的表达式也很好。谢谢!