如何将字母从字符串编码为数字

时间:2019-10-23 22:08:53

标签: javascript java

我想做的是将字符串中的数字编码为与字母对应的数字,然后保持数字不变。因此“ abc123”为“ 123123”。在javascript中找到了解决方案,但似乎不适合Java。任何帮助都会很棒,谢谢。

java函数类似于

def whattype():
    user_input = input(">>> ")
    try:                                                
            user_input = float(user_input)                      
            print(user_input ** 2)
    except ValueError:
            print("Sorry Dave, I'm afraid I can't do that")
            return 0.0

whattype()

jasvascript函数是

import tkinter as tk

class App(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        root = tk.Frame(self)

        self.screen_w = root.winfo_screenwidth()
        self.screen_h = root.winfo_screenheight()

        self.frames = {}
        for F in (Login, Search):
            page_name = F.__name__
            frame = F(parent=root, controller=self)
            self.frames[page_name] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("Search")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()

class Login(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller = controller

        self.screen_w = controller.screen_w
        self.screen_h = controller.screen_h

        self.display()

    def display(self):

        #login page (frame)
        self.login_page = tk.Frame(width=self.screen_w, height=self.screen_h, background="#ABEBC6")
        self.login_section = tk.Frame(width=100, height=100, background="#52BE80")

        self.login_page.pack()
        self.login_section.place(in_=self.login_page, anchor="c", relx = 0.5, rely = 0.5, relheight = 0.5, relwidth = 0.5)

        self.login_button = tk.Button(self.login_section, text='Login', fg = 'black', bg = 'green')
        self.login_button.place(relx = 0.5, rely = 0.55, relheight = 0.1, relwidth = 0.4, anchor = 'c')
        self.login_button.bind('<Button-1>', self.check_login)

    def check_login(self, event):

        self.controller.show_frame('Search')

class Search(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller = controller

        self.screen_w = controller.screen_w
        self.screen_h = controller.screen_h

        self.display()

    def display(self):

            #search page (frame)
            self.search_page = tk.Frame(width=self.screen_w, height=self.screen_h, background="#85C1E9")
            self.search_section = tk.Frame(width=100, height=100, background="#5DADE2")

            self.search_page.pack()
            self.search_section.place(in_=self.search_page, relx = 0.5, rely = 0.5, relheight = 0.5, relwidth = 0.5, anchor = 'center')

if __name__ == "__main__":
    app = App()
    app.mainloop()

3 个答案:

答案 0 :(得分: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();
}

对于相同的结果。

答案 1 :(得分:0)

您可以执行以下操作:

public class BinarySearchDemo {
    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()];
        StringBuffer result = new StringBuffer();
        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

答案 2 :(得分:0)

一种实现方法是使用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);