将七段转换为数字
Converting seven segment to number
我想将七段 数字 转换为 java 中的普通字符串。例如,如果输入这样的字符串
输入
_ _ _ _ _ _ _ _
| _| _||_||_ |_ ||_||_|| |
||_ _| | _||_| ||_| _||_|
输出应该像
1234567890
我找到了 this JavaScript 答案,我正在尝试将其转换为 java。
现在我有:
private static void get7segment(String ascii)
{
String[] splited="909561432".split("");
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
map.put(0, 63);
map.put(1, 6);
map.put(2, 91);
map.put(3, 79);
map.put(4, 102);
map.put(5, 109);
map.put(6, 125);
map.put(7, 7);
map.put(8, 127);
map.put(9, 111);
}
如有帮助将不胜感激
尝试将三行字符串解析为数字序列会很棘手w/o数字之间的某种分隔符。
123456789012345678901234567890
..._.._....._.._.._.._.._.._..
.|._|._||_||_.|_...||_||_||.|.
.||_.._|..|._||_|..||_|._||_|.
123456789012345678901234567890
以上是您的原始示例,其中 space 被点替换以突出显示它们。
请注意,有些数字是 1 个字符宽('1'),有些是两个字符('3','7'),其余是三个。
问题:
- '1 总是只占用两列吗?
- 在“2”和“3”之间以及“6”和“7”之间有一个 space,但在其他数字之间没有。在“1”之前还有一个前导 space。规则是要求少于三列的字符将具有前导 space 吗?
- 还会有其他 space 吗?
我这样做的方法是制作一个包含三个字符串(三行)的对象。字符串的长度必须相等。然后,实现一个字符解析器,从三个字符串中平均提取字符。如果所有三个字符都是 space,则删除它们。如果没有,读一个专栏,你有'1'吗?如果没有,再读一遍,你有“3”还是“7”?如果没有,请看第三篇,你的性格是什么?
有帮助吗?
基于Nina Scholz's想法:
public static void main(String[] args) {
String example= " _ _ _ _ _ _ _ _ \n| | | _| _||_||_ |_ ||_||_| \n|_| ||_ _| | _||_| ||_| _|";
System.out.println(get7segment(example));
}
private static String get7segment(String ascii) {
String result = "";
String[] lines = ascii.split("\n");
String[] line1;
String[] line2;
String[] line3;
for (int j = 0; j < lines.length - 2; j += 4) {
line1 = lines[j].split("");
line2 = lines[j + 1].split("");
line3 = lines[j + 2].split("");
String pow = "";
int mod = 3;
for (int i = 0; i < line1.length; i++) {
if (i % mod == 0) {
String strAs = digitToString(pow);
result += strAs;
pow = "";
}
if (line1[i].equals("_") && i % mod == 1)
pow += "0";
if (line2[i].equals("|") && i % mod == 0)// left
pow += "5";
if (line2[i].equals("|") && i % mod == 2)// right
pow += "1";
if (line2[i].equals("_") && i % mod == 1)// bottom
pow += "6";
if (line3[i].equals("|") && i % mod == 0)// left
pow += "4";
if (line3[i].equals("|") && i % mod == 2)// right
pow += "2";
if (line3[i].equals("_") && i % mod == 1)// bottom
pow += "3";
if (line1.length - 1 == i) {
String strAs = digitToString(pow);
result += strAs;
pow = "";
}
}
result += "\n";
}
return result;
}
/*
* Converting single ascii digit to regular digit
*/
private static String digitToString(String asciiDigit) {
if (asciiDigit == null || asciiDigit.equals(""))
return "";
int pow = 0;
for (int i = 0; i < asciiDigit.length(); i++)
pow += Math.pow(2, Character.getNumericValue(asciiDigit.charAt(i)));
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>() {
{
put(63, 0);
put(6, 1);
put(91, 2);
put(79, 3);
put(102, 4);
put(109, 5);
put(125, 6);
put(7, 7);
put(127, 8);
put(111, 9);
}
};
return map.containsKey(pow) ? Integer.toString(map.get(pow)) : "?";
}
Output:
0123456789
我想将七段 数字 转换为 java 中的普通字符串。例如,如果输入这样的字符串
输入
_ _ _ _ _ _ _ _
| _| _||_||_ |_ ||_||_|| |
||_ _| | _||_| ||_| _||_|
输出应该像
1234567890
我找到了 this JavaScript 答案,我正在尝试将其转换为 java。
现在我有:
private static void get7segment(String ascii)
{
String[] splited="909561432".split("");
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
map.put(0, 63);
map.put(1, 6);
map.put(2, 91);
map.put(3, 79);
map.put(4, 102);
map.put(5, 109);
map.put(6, 125);
map.put(7, 7);
map.put(8, 127);
map.put(9, 111);
}
如有帮助将不胜感激
尝试将三行字符串解析为数字序列会很棘手w/o数字之间的某种分隔符。
123456789012345678901234567890
..._.._....._.._.._.._.._.._..
.|._|._||_||_.|_...||_||_||.|.
.||_.._|..|._||_|..||_|._||_|.
123456789012345678901234567890
以上是您的原始示例,其中 space 被点替换以突出显示它们。 请注意,有些数字是 1 个字符宽('1'),有些是两个字符('3','7'),其余是三个。
问题: - '1 总是只占用两列吗? - 在“2”和“3”之间以及“6”和“7”之间有一个 space,但在其他数字之间没有。在“1”之前还有一个前导 space。规则是要求少于三列的字符将具有前导 space 吗? - 还会有其他 space 吗?
我这样做的方法是制作一个包含三个字符串(三行)的对象。字符串的长度必须相等。然后,实现一个字符解析器,从三个字符串中平均提取字符。如果所有三个字符都是 space,则删除它们。如果没有,读一个专栏,你有'1'吗?如果没有,再读一遍,你有“3”还是“7”?如果没有,请看第三篇,你的性格是什么?
有帮助吗?
基于Nina Scholz's想法:
public static void main(String[] args) {
String example= " _ _ _ _ _ _ _ _ \n| | | _| _||_||_ |_ ||_||_| \n|_| ||_ _| | _||_| ||_| _|";
System.out.println(get7segment(example));
}
private static String get7segment(String ascii) {
String result = "";
String[] lines = ascii.split("\n");
String[] line1;
String[] line2;
String[] line3;
for (int j = 0; j < lines.length - 2; j += 4) {
line1 = lines[j].split("");
line2 = lines[j + 1].split("");
line3 = lines[j + 2].split("");
String pow = "";
int mod = 3;
for (int i = 0; i < line1.length; i++) {
if (i % mod == 0) {
String strAs = digitToString(pow);
result += strAs;
pow = "";
}
if (line1[i].equals("_") && i % mod == 1)
pow += "0";
if (line2[i].equals("|") && i % mod == 0)// left
pow += "5";
if (line2[i].equals("|") && i % mod == 2)// right
pow += "1";
if (line2[i].equals("_") && i % mod == 1)// bottom
pow += "6";
if (line3[i].equals("|") && i % mod == 0)// left
pow += "4";
if (line3[i].equals("|") && i % mod == 2)// right
pow += "2";
if (line3[i].equals("_") && i % mod == 1)// bottom
pow += "3";
if (line1.length - 1 == i) {
String strAs = digitToString(pow);
result += strAs;
pow = "";
}
}
result += "\n";
}
return result;
}
/*
* Converting single ascii digit to regular digit
*/
private static String digitToString(String asciiDigit) {
if (asciiDigit == null || asciiDigit.equals(""))
return "";
int pow = 0;
for (int i = 0; i < asciiDigit.length(); i++)
pow += Math.pow(2, Character.getNumericValue(asciiDigit.charAt(i)));
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>() {
{
put(63, 0);
put(6, 1);
put(91, 2);
put(79, 3);
put(102, 4);
put(109, 5);
put(125, 6);
put(7, 7);
put(127, 8);
put(111, 9);
}
};
return map.containsKey(pow) ? Integer.toString(map.get(pow)) : "?";
}
Output:
0123456789