我很难让这个工作。每次向数组添加某些内容时都会调用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。
答案 0 :(得分:0)
确保在equals()
课程中定义hashCode()
和sq
。有关详细信息,请参阅this question。
如果sq
实例未实现equals()
,那么它将使用Object
中的默认实现来检查这两个对象是否是同一个实例。
答案 1 :(得分:0)
首先,您可以将代码简化为以下内容:
isLoop(){
return Arrays.asList(SQUARES).contains(sq);
}
尽管您在其他地方已经说过,SQUARES
必须是一个数组,而sq
必须是Class的对象实例,否则您的代码将无法编译。
equals()
的{{1}}方法在sq
中的某个对象上调用时,SQUARES
必须返回true才能返回true。
答案 2 :(得分:0)
考虑切换到某些Set实现(例如HashSet
类)来搜索集合是否包含特定元素。它比循环遍历列表要快得多。甲
如上所述,请记住equals()
和hashcode()
方法。
答案 3 :(得分:0)
您在评论中说明您没有覆盖equals()
或hashCode()
,这将是您的问题,因为默认情况下(并且设计)Java不知道两个对象是否有意义相等(因为这将根据班级而有所不同!)
查看here,了解equals()
和hashCode()
方法的优秀指南以及如何正确实施这些方法。或者,如果您感到懒惰,许多IDE将根据许多选定的字段为您实现它们。当你知道它们如何工作时,我只推荐这种方法!
顺便说一下,当HashSet是一个更好的选择时,似乎你在这里使用一个列表 - 通过设计它不包含重复项并且检测它们非常快(它不需要经过你正在这里检查它们的整个清单。)
答案 4 :(得分:0)
为什么要将SQUARES转换为列表,我认为使用contains
方法,您正在使用此转换。
例如,考虑一下,如果你想得到一个值的索引,即 static int sq = 9;
Arrays.binarySearch(SQUARES,sq); // returns the index at which the value 9 is present