【问题标题】:Array list not being searched properly未正确搜索数组列表
【发布时间】:2011-06-28 00:46:57
【问题描述】:

我很难让它发挥作用。每次将某些内容添加到数组时都会调用 isLoop() 方法,以确保没有重复项。当有重复时,它应该返回 true。但事实并非如此。

isLoop(){
    if(!Arrays.asList(SQUARES).contains(sq)){
        return false;
    }else{
        return true;
    }
}

我是否遗漏了有关数组的一些基本知识?我对Java相当陌生,所以可能就是这样! :D

编辑

我被要求展示对象是如何被实例化的,所以我在这里发布了整个课程:

class Happy {
static int SQUARES[] = new int[10000];
static int sq;

public static boolean isHappy(int num){
    int s = 0;
    int n = num;

    int i=0;

    for(sq = num; (!isLoop()) && (sq > 1);){
        sq = addSquaresOfDigits(sq);
        SQUARES[i] = sq;
        i++;

    }

    if(isLoop()){
        return false;
    }else{
        return true;
    }
}

static int addSquaresOfDigits(int number) {
    int result = 0;
    int tmp;
    while(number > 0) {
        tmp = number % 10;
        result += tmp * tmp;
        number /= 10;
    }
return result;
}

static boolean isLoop(){
    if(!Arrays.asList(SQUARES).contains(sq)){
        return false;
    }else{
        return true;
    }
}

方法 isHappy() 将测试给它的数字是否为happy number

【问题讨论】:

  • SQUARES 包含什么?它是您定义的类型吗?可能是你有一个错误的equals() 实现。
  • 什么是平方?最初添加到数组中的是什么? sq的类是否覆盖了equals()方法?
  • sq 是要添加到数组中的项目的当前值。它不会覆盖 equals() 方法
  • Lewis 什么类型的物体是方形的?

标签: java arrays contains


【解决方案1】:

确保在 sq 类上定义 equals()hashCode()。有关详细信息,请参阅this question

如果sq 实例没有实现equals(),那么它将使用Object 中的默认实现,即检查两个对象是否是同一个实例。

【讨论】:

  • sq 必须是类的实例,否则您添加的 sn-p 将无法编译。您能否更新问题以显示您如何实例化 sq
【解决方案2】:

首先,您可以将代码简化为以下内容:

isLoop(){
    return Arrays.asList(SQUARES).contains(sq);
}

尽管您在其他地方说过,SQUARES 必须是一个数组,sq 必须是一个类的对象实例,否则您的代码将无法编译。

sqequals() 方法在 SQUARES 中的一个对象上调用时必须返回 true,isLoop() 才能返回 true。

【讨论】:

  • 谢谢...我是 Java 新手,所以我忽略了一些小细节。
【解决方案3】:

考虑切换到某些 Set 实现(例如 HashSet 类)来搜索集合是否包含特定元素。它比遍历列表要快得多。一个

如前所述,请记住 equals()hashcode() 方法。

【讨论】:

    【解决方案4】:

    您在评论中声明您尚未覆盖 equals()hashCode(),这将是您的问题,因为默认情况下(和设计)Java 不知道两个对象是否有意义地相等(因为这会有所不同取决于班级!)

    查看here 以获取有关equals()hashCode() 方法以及如何正确实施它们的良好指南。或者,如果您觉得懒惰,许多 IDE 会根据许多选择的字段为您实现它们。但是,我只会在您知道它们的工作原理时才推荐这种方法!

    顺便说一句,当 HashSet 是一个更好的选择时,您似乎在这里使用了一个列表 - 根据设计,它不包含重复项并且检测它们的速度非常快(它不需要经过整个列表以在此处检查它们。)

    【讨论】:

    • 我刚刚编辑了我的原始问题以包含 isLoop() 方法所在的完整类。抛开所有其他初学者 java 错误,我将如何使用哈希集?像这样? Set SQUARES = new HashSet();
    【解决方案5】:

    为什么要将 SQUARES 转换为列表,我认为要使用 contains 方法,您正在使用此转换。

    例如考虑,如果你想获得一个值的索引,即 static int sq = 9;

    Arrays.binarySearch(SQUARES,sq);  // returns the index at which the value 9 is present
    

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多