将置换方法从 Java 转换为 JavaScript

Convert permute method from Java to JavaScript

我实现了一个 Java 代码,用于排列组合字符串与输入 str= "word1 word2 word3" 然后输出为:

arr[0]="word1 word2"

arr[1]="word1 word3"

arr[2]="word1 word2 word3"

arr[3]="word2 word1"

arr[4]="word2 word1 word3"

arr[5]="word2 word3 word1"

arr[6]="word3 word1"

arr[7]="word3 word1 word2"

arr[8]="word3 word2 word1"

这是Java代码:

private static void permute(String[] ss, boolean[] used, String res, int level, List<String> list) {

    if (level == ss.length && res != ""){
        list.add(res);
    return;
    }

    for (int i = 0; i < ss.length; i++) {
        // Check if the string is currently used
        if (used[i]) {
            continue;
        }
        // Check if res is empty or a single word
        if(level > 1)
            list.add(res);
            used[i] = true;
            permute(ss, used, res + " " + ss[i], level + 1, list);
            used[i] = false;
        }
    }

public static List<String> PermuteWords(String s){
    String[] ss = s.split(" ");
    boolean[] used = new boolean[ss.length];
    String res = "";
    List<String> list = new ArrayList<String>();
    permute(ss, used, res, 0, list);
    return list;
}

转JS代码时,不知道这段代码有什么错误:

function permute(ss, used, res, level, list){
  if(level==ss.lenght&&res!==""){
      list.add(res);
      return;
  }

  for(var i=0; i<ss.lenght; i++){
      if (used[i]===true){
        continue;
      }

      if(level>1){
        list.add(res);
        used[i]=true;
        permute(ss, used, res+" "+ss[i], level+1, list)
        used[i]=false;
      }
    }
}
function permuteword(s){
  var ss;
  for(var i=0; i<s.length;i++){
      ss[i]=s[i];
  }
  var used;
  for(var j=0; j<s.length;j++){
      used[j]=false;
  }
  var result;
  permute(ss, used, res, 0, result);
  return result;
}

Java 和 Javascript 听起来几乎一样,但事实并非如此。他们采用不同的方法做不同的事情。如果在 Java 中您正在检查控制台是否存在 运行 程序的错误,那么在 Java 脚本中您可以在浏览器控制台中检查错误(使用 打开控制台F12)

填充数组
Java脚本数组没有 add() 方法。要为其添加值,请使用 push
list.push(res)

填充数组#2
permuteword() 函数中,您试图填充未初始化的变量 ss。编译器不明白你想把那个值放在哪里。将 ss 初始化为空数组:
var ss = [];

打字错误
在第一个 for 循环中,您有 ss.lenght。解决这个问题。始终检查拼写错误。

额外
permuteword() 中,您将 res 传递给 permute() 函数,尽管您没有在函数中定义它。如果 res 是在函数之外定义的全局变量,事情就会起作用。


并利用该浏览器控制台。每个 Java 脚本开发人员(从新手到专业人士)都始终打开它!

我 运行 couchdb 和 cloudant 中的代码显示了我错过检查语法的一般错误。我将代码修改为:

function permute(ss, used, res, level, list){
  if(level==ss.lenght&&res!==""){
      list.push(res);
      return;
  }

  for(var i=0; i<ss.length; i++){
      if (used[i]===true){
        continue;
      }

      if(level>1){
        list.push(res);
        used[i]=true;
        permute(ss, used, res+" "+ss[i], level+1, list)
        used[i]=false;
      }
    }
}
function permuteword(s){
  var ss=[];

  for(var i=0; i<s.length;i++){
      ss[i]=s[i];
  }

  var used=[];
  for(var j=0; j<s.length;j++){
      used[j]=false;
  }
  res="";

  var result=[];
  permute(ss, used, res, 0, result);
  return result;
}

function(doc){
  var list=permuteword("word1 word2 word3");
  for(var i=0; i<list.length; i++){
      index("default", list[i],{store, true});
  }
}

但是,我仍然遇到如下错误:

{"error":"{nocatch,{compilation_error,<<\"Expression does not eval to a function. ((new String(\"function permute(ss, used, res, level, list){\r\n if(level==ss.lenght&&res!==\\"\\"){\r\n list.push(res);\r\n return;\r\n }\r\n\r\n for(var i=0; i1){\r\n list.push(res);\r\n used[i]=true;\r\n permute(ss, used, res+\\" \\"+ss[i], level+1, list)\r\n used[i]=false;\r\n }\r\n }\r\n}\r\nfunction permuteword(s){\r\n var ss=[];\r\n ss=s.split(\\" \\");\r\n var used=[];\r\n for(var j=0; j>}}","reason":"[{couch_os_process,prompt,3,[{file,\"src/couch_os_process.erl\"},{line,65}]},\n {dreyfus_index_updater,update,2,\n [{file,\"src/dreyfus_index_updater.erl\"},{line,42}]}]"}