我想做的是将字符串中的数字编码为与字母对应的数字,然后保持数字不变。因此“ 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()
答案 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);