Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的Havel Hakimi算法代码有什么问题?_Java_Algorithm - Fatal编程技术网

Java 我的Havel Hakimi算法代码有什么问题?

Java 我的Havel Hakimi算法代码有什么问题?,java,algorithm,Java,Algorithm,我试图练习我的编码技巧,我在Dailyprogrammer Reddit上找到了一个使用Havel Hakimi算法()的编码练习,但它总是返回错误的布尔值 public static void main(String[] args) { int[] answer = {16, 9, 9, 15, 9, 7, 9, 11, 17, 11, 4, 9, 12, 14, 14, 12, 17, 0, 3, 16}; System.out.println(hh(answer));

我试图练习我的编码技巧,我在Dailyprogrammer Reddit上找到了一个使用Havel Hakimi算法()的编码练习,但它总是返回错误的布尔值

public static void main(String[] args) {
    int[] answer = {16, 9, 9, 15, 9, 7, 9, 11, 17, 11, 4, 9, 12, 14, 14, 12, 17, 0, 3, 16};
    System.out.println(hh(answer));
    ArrayList<Integer> temp = new ArrayList<Integer>();
    System.out.println(temp.size());
}

//This is the actual Havel-Hakimi Algorithm Method
public static boolean hh(int[] answer) {
    ArrayList<Integer> temp = new ArrayList<Integer>();
    int n;
    for(int i = 0; i < answer.length; i++) {
        temp.add(answer[i]);
    }
    for(int j = 0; j < temp.size(); j++) {
        if(temp.get(j) == 0)
            temp.remove(j);
    }

    if(temp.size() == 0) {
        return true;
    }
    Collections.sort(temp);
    for(int t = 0; t < temp.size(); t++) {
    }
    n = temp.get(0);
    temp.remove(0);
    if(n > temp.size()) {
        return false;
    }
    for(int k = 0; k < n; k++) {
        temp.set(k, temp.get(k) - 1);
    }
    int[] newAnswer = new int[temp.size()];;
    for(int l = 0; l < temp.size(); l++) {
        newAnswer[l] = temp.get(l);
    }
    return hh(newAnswer);

}
我试图在每个循环中检查我的进程,以确保所有方法都做了正确的工作,并且输出是我所期望的,但它总是返回错误的布尔值

public static void main(String[] args) {
    int[] answer = {16, 9, 9, 15, 9, 7, 9, 11, 17, 11, 4, 9, 12, 14, 14, 12, 17, 0, 3, 16};
    System.out.println(hh(answer));
    ArrayList<Integer> temp = new ArrayList<Integer>();
    System.out.println(temp.size());
}

//This is the actual Havel-Hakimi Algorithm Method
public static boolean hh(int[] answer) {
    ArrayList<Integer> temp = new ArrayList<Integer>();
    int n;
    for(int i = 0; i < answer.length; i++) {
        temp.add(answer[i]);
    }
    for(int j = 0; j < temp.size(); j++) {
        if(temp.get(j) == 0)
            temp.remove(j);
    }

    if(temp.size() == 0) {
        return true;
    }
    Collections.sort(temp);
    for(int t = 0; t < temp.size(); t++) {
    }
    n = temp.get(0);
    temp.remove(0);
    if(n > temp.size()) {
        return false;
    }
    for(int k = 0; k < n; k++) {
        temp.set(k, temp.get(k) - 1);
    }
    int[] newAnswer = new int[temp.size()];;
    for(int l = 0; l < temp.size(); l++) {
        newAnswer[l] = temp.get(l);
    }
    return hh(newAnswer);

}
publicstaticvoidmain(字符串[]args){
int[]答案={16,9,9,15,9,7,9,11,17,11,4,9,12,14,14,12,17,0,3,16};
系统输出打印LN(hh(答案));
ArrayList temp=新的ArrayList();
System.out.println(temp.size());
}
//这是实际的Havel Hakimi算法
公共静态布尔hh(int[]答案){
ArrayList temp=新的ArrayList();
int n;
for(int i=0;i温度大小()){
返回false;
}
对于(int k=0;k

使用main方法中提供的数组,“hh”方法应返回true,但返回false。

问题在于
集合。sort(temp)
,它按升序对输入集合排序,而您希望它按降序排序。您可以使用
Collections.sort(临时、Collections.reverseOrder())

这是代码中的逻辑问题

我应该指出,有些语句在代码中是不必要的(例如
Collections.sort(temp)
之后的
for
循环,它什么也不做),其他语句可以增强(例如前两个
for
循环,而不是复制整个数组,然后对其进行过滤,为什么不只是复制所需的元素?),您还可以通过使用
while(true)
循环来避免使用递归

以下代码将帮助您解决问题:

publicstaticvoidmain(字符串[]args){
int[]答案={16,9,9,15,9,7,9,11,17,11,4,9,12,14,14,12,17,0,3,16};
系统输出打印LN(hh(答案));
}
//这是实际的Havel Hakimi算法
公共静态布尔hh(int[]答案){
while(true){
//从应答数组中筛选零
ArrayList temp=新的ArrayList(数组
//从int[]获取流
.stream(答案)
//过滤器零(返回一个IntStream)
.过滤器(a->a!=0)
//将其重新转换为流
.boxed()
//将流收集为列表
.collect(Collectors.toList());
//如果筛选后筛选数组变为空,请检查筛选后的数组
if(temp.isEmpty()){
返回true;
}
//按降序对过滤后的数组进行排序
Collections.sort(temp,Collections.reverseOrder());
//移除第一个元素(注意,Remove方法返回移除的元素)
int n=温度移除(0);
//检查第一个删除的元素是否大于数组的新大小
如果(n>温度大小()){
返回false;
}
//为下一次迭代重建输入数组
answer=IntStream.range(0,temp.size())
.map(i->i

如果您不熟悉
,您可以简单地将
用于
循环。

问题在于
集合。sort(temp)
,它按升序对输入集合进行排序,而您希望它按降序排序。您可以使用
Collections.sort(临时、Collections.reverseOrder())

这是代码中的逻辑问题

我应该指出,有些语句在代码中是不必要的(例如
Collections.sort(temp)
之后的
for
循环,它什么也不做),其他语句可以增强(例如前两个
for
循环,而不是复制整个数组,然后对其进行过滤,为什么不只是复制所需的元素?),您还可以通过使用
while(true)
循环来避免使用递归

以下代码将帮助您解决问题:

publicstaticvoidmain(字符串[]args){
int[]答案={16,9,9,15,9,7,9,11,17,11,4,9,12,14,14,12,17,0,3,16};
系统输出打印LN(hh(答案));
}
//这是实际的Havel Hakimi算法
公共静态布尔hh(int[]答案){
while(true){
//从应答数组中筛选零
ArrayList temp=新的ArrayList(数组
//从int[]获取流
.stream(答案)
//过滤器零(返回一个IntStream)
.过滤器(a->a!=0)
//将其重新转换为流
.boxed()
//将流收集为列表
.collect(Collectors.toList());
//如果筛选后筛选数组变为空,请检查筛选后的数组
if(temp.isEmpty()){
返回true;
}
//按降序对过滤后的数组进行排序
Collections.sort(temp,Collections.reverseOrder());
//移除第一个元素(注意,Remove方法返回移除的元素)
int n=温度移除(0);
//检查第一个删除的元素是否大于数组的新大小
如果(n>温度大小()){
返回false;
}
//为下一次迭代重建输入数组
ans