Java 在数组列表对的集合中搜索

Java 在数组列表对的集合中搜索,java,if-statement,collections,arraylist,iterator,Java,If Statement,Collections,Arraylist,Iterator,我正在尝试搜索ArrayList if对的集合。我想做的是遍历集合,找到一对中的第一个值,然后返回该对的第二个值。我遇到的问题是,我必须查找第一个值的检查似乎不起作用,因此每次搜索时,我都返回null。我知道我的if语句存在问题,但我似乎无法找出我做错了什么。由于这是一个家庭作业,我无法向我的结对类或结对列表类显示所有代码,但我可以向您展示搜索第一个值的方法: public S findFirst(F firstValue) { Iterator<Pair> myIter =

我正在尝试搜索ArrayList if对的集合。我想做的是遍历集合,找到一对中的第一个值,然后返回该对的第二个值。我遇到的问题是,我必须查找第一个值的检查似乎不起作用,因此每次搜索时,我都返回null。我知道我的if语句存在问题,但我似乎无法找出我做错了什么。由于这是一个家庭作业,我无法向我的结对类或结对列表类显示所有代码,但我可以向您展示搜索第一个值的方法:

public S findFirst(F firstValue) {
    Iterator<Pair> myIter = this.iterator();
    S tmp2 = null;
    while (myIter.hasNext()) {
        Pair tmp1 = myIter.next();
        if (tmp1.getFirst() == firstCall) {
            tmp2 = (S) tmp1.getSecond();
        }
    }
    return tmp2;
}

然后,每当我测试第一个值时,我就会得到第二个值,所以我知道我至少在正确的路径上,但我假设我在if语句中检查的内容有问题。有人知道我如何正确地做到这一点吗?(请记住,这是家庭作业,因此如何找出这一点的指南对我来说远比随机回答更有价值,我想学习,而不仅仅是得到答案)提前感谢

不要使用
=
来比较对象。重写并使用
equals()

不要使用
=
来比较对象。重写并使用
equals()

我认为

if (tmp1.getFirst() == firstCall)
应该说

if (tmp1.getFirst().equals(firstValue))
重要的区别在于==检查两个表达式是否引用完全相同的对象。您更感兴趣的是知道您的两个表达式是否实际引用了相等的对象。

我认为

if (tmp1.getFirst() == firstCall)
应该说

if (tmp1.getFirst().equals(firstValue))
重要的区别在于==检查两个表达式是否引用完全相同的对象。您更感兴趣的是知道您的两个表达式是否实际引用了相等的对象。

尝试以下方法:

if (tmp1.getFirst().equals(firstValue))
而不是

if (tmp1.getFirst() == firstCall)
您还可以重写自己的equals方法

您不应该使用
==
来比较对象

检查并尝试以下操作:

if (tmp1.getFirst().equals(firstValue))
而不是

if (tmp1.getFirst() == firstCall)
您还可以重写自己的equals方法

您不应该使用
==
来比较对象

检查马特说的话,(不要使用
=
),但我认为更大的问题是你没有返回“第一次”遭遇。。。。您的
if
语句应该如下所示:

public S findFirst(F firstValue) {
    Iterator<Pair> myIter = this.iterator();
    while (myIter.hasNext()) {
        Pair tmp1 = myIter.next();
        if (firstValue.equals(tmp1.getFirst())) {
            return (S) tmp1.getSecond();
        }
    }
    return null;
}
publicsfindfirst(F firstValue){
迭代器myIter=this.Iterator();
while(myIter.hasNext()){
Pair tmp1=myIter.next();
if(firstValue.equals(tmp1.getFirst())){
返回tmp1.getSecond();
}
}
返回null;
}
马特说的,(不要使用
==
)但我认为更大的问题是你没有返回“第一次”遭遇。。。。您的
if
语句应该如下所示:

public S findFirst(F firstValue) {
    Iterator<Pair> myIter = this.iterator();
    while (myIter.hasNext()) {
        Pair tmp1 = myIter.next();
        if (firstValue.equals(tmp1.getFirst())) {
            return (S) tmp1.getSecond();
        }
    }
    return null;
}
publicsfindfirst(F firstValue){
迭代器myIter=this.Iterator();
while(myIter.hasNext()){
Pair tmp1=myIter.next();
if(firstValue.equals(tmp1.getFirst())){
返回tmp1.getSecond();
}
}
返回null;
}

您是否可以使用
HashMap
而不是
ArrayList
?这就是它们设计的目的。我请求你不要使用
=
来比较字符串。@大卫,不,它必须是一个数组列表。你可以使用
哈希映射来代替
数组列表吗?这就是它们设计的目的。我请求你不要用
=
来比较字符串。@大卫,不,它必须是一个数组,你是对的。我甚至都没想过,我忙着做比较,这很可悲,因为我在上一次作业中使用了.equals,并与某人争论为什么用它代替等号更明智。我已经做了改变,现在一切都很完美。非常感谢。当然我现在意识到了一个新问题,我只能搜索集合中的最后一个条目,所以如果我在集合中添加一对,比如说,一对和二对,然后再添加一对三对和四对,如果我使用此方法查找一对,我会得到null,乐趣永远不会结束……你是对的。我甚至都没想过,我忙着做比较,这很可悲,因为我在上一次作业中使用了.equals,并与某人争论为什么用它代替等号更明智。我已经做了改变,现在一切都很完美。非常感谢。当然,我现在意识到了一个新问题,我只能搜索集合中的最后一个条目,所以如果我在集合中添加一对,比如说,一对和二对,然后再添加一对三对和四对,如果我使用此方法查找一对,我会得到null,乐趣永无止境。。。