【问题标题】:How to encode letter from string into numbers如何将字符串中的字母编码为数字
【发布时间】:2020-02-20 05:11:06
【问题描述】:

我要做的是将字符串中的数字编码为根据字母表的数字,然后保持数字不变。所以“abc123”将是“123123”。在 javascript 中找到了解决方案,但似乎不适合 java。任何帮助都会很棒,谢谢。

java 函数类似于

import java.util.*; 
import java.io.*;

class Main {

  public static String NumberEncoding(String str) {
    ***call javascript function or translate it into java
  }

  public static void main (String[] args) {  
    // keep this function call here     
    Scanner s = new Scanner(System.in);
    System.out.print(NumberEncoding(s.nextLine())); 
  }

}

jasvascript 函数是

function NumberEncoding(str) { 
str = str.toLowerCase();
var obj = {};
var alpha = "abcdefghijklmnopqrstuvwxyz";
var result = "";
for (var i = 1; i <= alpha.length; i++) {
    obj[alpha[i-1]] = i;
}

for (var j = 0; j < str.length; j++) {
  if (str[j].match(/[a-z]/)) {
    result += obj[str[j]];
  } else {
    result += str[j]; 
  }
}
return result;
}

【问题讨论】:

  • 感谢您的回复。我编辑了这个问题。任何帮助编码它是apreciated
  • 啊,我误会了。我以为您正在尝试将函数转换为 java,而不是从 java 调用它。 Call external javascript functions from java code 有一些调用存储为字符串的 javascript 的好例子,答案讨论了如何调用存储在文件中的脚本。希望对您有所帮助。
  • 你没看错,我正在尝试将它翻译成java。如果我可以从 java 调用 javascript 并使其工作,那也可以

标签: javascript java


【解决方案1】:

第一步,创建一个变量来累积String结果;我会使用StringBuilder。第二步,一次迭代输入String一个字符。第三步,将该字符转换为小写。第四步,检查字符不是数字。第五步,如果字符是数字,则不加改动地通过,否则值很容易确定,因为 Java 字符是整数类型(例如 'a' + 1 = 'b' 和 'b' - 1 = 'a')。第六步,将结果返回为String。最后,Java 命名约定是驼峰式(以小写字母开头)。喜欢,

public static String encodeNumber(String str) {
    StringBuilder result = new StringBuilder();
    for (int j = 0; j < str.length(); j++) {
        char c = Character.toLowerCase(str.charAt(j));
        if (c < 'a' || c > 'z') {
            result.append(c);
        } else {
            result.append(1 + c - 'a');
        }
    }
    return result.toString();
}

但是,如果您真的想要,您确实可以使用Nashorn 直接从Java 调用JavaScript 函数。喜欢,

String f = "function NumberEncoding(str) { str = str.toLowerCase();\n" 
        + "var obj = {};\n"
        + "var alpha = \"abcdefghijklmnopqrstuvwxyz\";\n" 
        + "var result = \"\";\n"
        + "for (var i = 1; i <= alpha.length; i++) {\n" 
        + "    obj[alpha[i-1]] = i;\n" + "}\n" + "\n"
        + "for (var j = 0; j < str.length; j++) {\n" 
        + "  if (str[j].match(/[a-z]/)) {\n"
        + "    result += obj[str[j]];\n" 
        + "  } else {\n" + "    result += str[j];" + "  }\n" + "}\n"
        + "return result;\n" + "}";
ScriptEngine se = new ScriptEngineManager().getEngineByName("js");
try {
    se.eval(f);
    Invocable invocable = (Invocable) se;
    Object result = invocable.invokeFunction("NumberEncoding", "zabc123");
    System.out.println(result);
} catch (Exception e) {
    e.printStackTrace();
}

同样的结果。

【讨论】:

  • 感谢您的回复。我尝试了您的 java 解决方案并适用于字母,但不适用于数字和字母字符串。 “hello 45”将是“85121215 45”,而是给我“85121215-6445”
  • 空格不是字母。
  • 我写错了,我的错。任何字符都应该相同
  • @jvargas 已编辑。
【解决方案2】:

解决的步骤可以是

  1. 用 1 到 26 的值填充大小为 26(字母数量)的 int[],对应于字母在字母表中的位置。
  2. 遍历输入字符串的所有字符并将其位置从int[] 附加到StringBuilder。如果字符不是字母,请按原样附加。

演示:

public class Main {
    public static void main(String[] args) {
        System.out.println(numberEncoding("abc123"));// Expected: 123123
    }

    static String numberEncoding(String str) {
        str = str.toLowerCase();
        String alpha = "abcdefghijklmnopqrstuvwxyz";
        int[] obj = new int[alpha.length()];
        StringBuilder result = new StringBuilder();
        for (int i = 1; i <= obj.length; i++) {
            obj[i - 1] = i;
        }

        for (int j = 0; j < str.length(); j++) {
            if (str.charAt(j) >= 'a' && str.charAt(j) <= 'z') {
                result.append(String.valueOf(obj[j]));
            } else {
                result.append(str.charAt(j));
            }
        }
        return result.toString();
    }
}

输出:

123123

【讨论】:

    【解决方案3】:

    一种方法是使用 StringBuilder。

          List<String> strings = Arrays.asList("abc123", "e2f3g4");
          for (String s : strings) {
             StringBuilder sb = new StringBuilder(s);
             for (int i = 0; i < sb.length(); i++) {
                char c = sb.charAt(i);
                if (Character.isAlphabetic(c)) {
                   sb.replace(i, i + 1, Integer.toString(c - 'a' + 1));
                }
             }
             System.out.println(sb.toString());
          }
    

    还有 Stream 版本。

          List<String> strings = Arrays.asList("123abc", "e1f2g3", "xyz123");
    
          List<String> converted = strings.stream().map(str -> str.chars().map(
                chr -> Character.isAlphabetic(chr) ? chr - 'a' + 1
                      : chr - '0').mapToObj(String::valueOf).collect(
                            Collectors.joining())).collect(Collectors.toList());
    
          System.out.println(converted);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2012-05-06
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多