我想检查数组或列表中的所有类似整数是否已分组。
{2, 2, 5, 5, 5, 1, 7, 7, 5, 7}
应该false
。虽然{2, 2, 5, 5, 5, 1, 7, 7, 7}
应该提供true
。这是我到目前为止,它应该true
时打印false
:
public class testing1 {
public static void main(String[] args){
int [] x = {2, 2, 5, 5, 5, 1, 7, 7, 5, 7};
System.out.println(isGrouped(x));
}
public static boolean isGrouped(int[] x){
for(int i = 0; i < x.length; i++){
for(int j = i + 1; j < x.length; j++){
if(x[i] == x[j])
return true;
}
}
return false;
}
}
答案 0 :(得分:2)
您目前输出错误
for(int i = 0; i < x.length; i++){
for(int j = i + 1; j < x.length; j++){
if(x[i] == x[j])
return true;
}
}
在找到任何数字的连续出现后立即返回true
(在您的情况下为2,2)。请注意,这将退出循环并且控件到达print语句,调用isGrouped
方法将打印true
。
实际上,简而言之, 在这种情况下你不会遍历完整列表,除非列表中的所有数字都不同。
除此之外,您应该为遍历过的每个元素维护一个遍历元素列表或设置为true的标志。而且,你不会在那里需要嵌套循环。
答案 1 :(得分:2)
这里有一个如何实现算法的提示。
那么,什么时候允许元素出现?
答案 2 :(得分:1)
您的代码不起作用,因为只要它找到两个相等的相邻值,它就会返回true。
一种解决方案是:
创建没有连续重复的新数组:
for (int i = 1; i < x.length; i++) {
if (x[i-1] != x[i]) {
newArr.add(x[i]);
}
}
现在删除所有重复项:
Set<Integer> set = new HashSet<>();
for (int i = 0; i < x.length; i++){
set.add(x[i]);
}
// create array from the set
并比较两者。
答案 3 :(得分:1)
如其他答案中所述,您的答案并未处理所有案件,因此不适用于多个案件。此外,这里不需要2个循环。如果第一次出现,您可以将已经看到的元素存储在哈希值和列表中的每个元素中。如果它没有第一次出现,如果前一个元素与此不相同,那么它应该是假的。
以下是代码:
public class testing1 {
public static void main(String[] args){
int [] x = {2, 2, 5, 5, 5, 1, 7, 7, 5, 7};
System.out.println(isGrouped(x));
}
public static boolean isGrouped(int[] x){
int prev = x[0] ;
Hashtable<Integer, Integer> hashtable =
new Hashtable<Integer, Integer>();
hashtable.put(x[0], 0);
for (int i = 1 ; i < x.length ; i ++)
{
if (hashtable.get(x[i]) != null && prev == x[i]){
hashtable.put(x[i], hashtable.get(x[i]) + 1);
}
else if (hashtable.get(x[i]) != null && prev != x[i]){
return false;
}
else{
hashtable.put(x[i], 0);
}
prev = x[i];
}
return true ;
}
}
这也存储每个元素的出现次数。 希望这会有所帮助:)