我正在制作数字的arraylist
private ArrayList<Integer> numbers = new ArrayList();
我必须检查它们是否都是独一无二的。所以我有这个代码:
public boolean isUnique()
{
ArrayList<Integer> checkNumbers = new ArrayList();
for(int i = 1; i<=numbers.size(); i++)
{
if(numbers.contains(i) && !checkNumbers.contains(i))
{
checkNumbers.add(i);
return true;
}
}
return false;
}
我的想法是,我必须接受一个正方形数(n)的整数输入,这是1 to n
唯一的。
但无论我添加到数字(13 2 13 2
),它总是返回true
。
我的逻辑出了什么问题?
答案 0 :(得分:2)
您需要迭代numbers
的内容,而不是其索引。
答案 1 :(得分:2)
如果列表中的数字可以包含的数字多于n,并且您只需要验证1 .. n是否存在且没有重复,那么您的代码应该修改为:
public boolean isUnique()
{
ArrayList<Integer> checkNumbers = new ArrayList();
for(int i = 1; i<=numbers.size(); i++)
{
if(numbers.contains(i))
{
if (!checkNumbers.contains(i))
checkNumbers.add(i);
else
return false;
}
else{
return false;
}
}
return true;
}
如果另一方面列表不能包含多于n个元素,则根本不需要其他列表:
public boolean isUnique()
{
if (numbers.size()<n)
return false;
for(int i = 1; i<=numbers.size(); i++)
{
if(!numbers.contains(i))
return false;
}
return true;
}
答案 2 :(得分:0)
您正在检查列表是否包含等于索引的值,而不是列表中的数字。您需要get()
索引处的值(或使用foreach循环)。
在向checkNumbers
添加号码后,您还有一个返回语句,因此在您向其添加第一个号码后,列表将立即超出范围。因此,在进行if评估时,它永远不会包含数字。
答案 3 :(得分:0)
checkNumbers
一开始就是空的,所以当它第一次找到列表中的i
值时,它会将该数字添加到checkNumbers
然后{{ 1}}。
我反转逻辑 - 第一次找到列表中的数字并且在return true
中,返回false。如果这种情况从未发生过,请返回true。
答案 4 :(得分:0)
您的方法返回true的原因是您在其中创建了checkNumbers
,因此它是空的。你输入数字并不重要 - 它不会在checkNumbers
中找到,添加它并返回true。
尝试使用数字来假设checkNumbers
。
答案 5 :(得分:0)
您创建一个新数组;
ArrayList<Integer> checkNumbers = new ArrayList();
然后在循环中执行此操作;
if (numbers.contains(i) && !checkNumbers.contains(i))
{
checkNumbers.add(i);
return true;
}
!checkNumbers.contains(i)
始终为真;你刚刚创造了它;它是空的。因此,第一次numbers.contains(i)
为true
时,该方法将返回true
。
答案 6 :(得分:0)
问题是你比较索引而不是索引处的值:)。
答案 7 :(得分:0)
您方法中的问题是,您检查i
的每个值是否都在ArrayList
中。你要做的是使用get()
,所以你必须这样做:
public boolean isUnique()
{
ArrayList<Integer> checkNumbers = new ArrayList();
for(int i = 1; i<=numbers.size(); i++)
{
if(numbers.contains(checkNumbers.get(i)) && !checkNumbers.contains(numbers.get(i)))
{
checkNumbers.add(i);
return true;
}
}
return false;
}