将七段转换为数字

时间:2019-09-18 16:44:35

标签: javascript java seven-segment-display

我想将七个段数字转换为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);            
    }

任何帮助都是丰富的

2 个答案:

答案 0 :(得分:1)

基于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)) : "?";
    }
  

输出:

0123456789

答案 1 :(得分:0)

试图将三行字符串解析为数字序列,而在数字之间没有某种定界符,将很棘手。

123456789012345678901234567890
..._.._....._.._.._.._.._.._..
.|._|._||_||_.|_...||_||_||.|.
.||_.._|..|._||_|..||_|._||_|.
123456789012345678901234567890

以上是您的原始示例,其中的空格用点代替以突出显示它们。 请注意,有些数字的宽度为1个字符(“ 1”),有些数字为2个字符(“ 3”,“ 7”),其余的为3。

问题: -'1总是只占用两列吗? -“ 2”和“ 3”之间以及“ 6”和“ 7”之间有一个空格,但其他数字之间没有空格。 “ 1”之前还有一个前置空间。要求少于三列的字符是否有前导空格的规则? -还会有其他空间吗?

我这样做的方法是制作一个包含三个String(三行)的对象。字符串长度必须相等。然后,实现一个按字符排序的解析器,将字符从三个字符串中平均拉出。如果所有三个字符都是空格,请将其放下。如果不是,请阅读一列,您是否有一个“ 1”?如果不是,请再读一遍,您是否拥有“ 3”或“ 7”?如果没有,请读第三篇,您拥有什么角色?

有帮助吗?