从图形表示中获取字母(A-Z)

时间:2018-07-08 13:19:16

标签: java ascii ascii-art

如何从包含图形表示形式的字符串中获取字符(A-Z)? 例如,如果我使用的是3x5字母,则字母“ A”的图形表示为:

 #
# #
###
# #
# #

这个是'E'的

###
# 
###
#
###

我可以这样做,但是看起来不合适!

switch (input)
//Case 1 belongs to character A
case " # \n# #\n###\n# #\n# #\n":
{
return 'A';
}
case "###\n# \n###\n#  \n###\n":
{
return 'E';
}
//till question mark
default: return '?';

是否有使用Java的算法或某些ASCII艺术技巧来做到这一点?

3 个答案:

答案 0 :(得分:1)

即使您不需要双向映射,我也可以使用Map以可读的方式存储字母:

public class Letters {

    public String getLetter(String graphicalLetter) {
        return letters.get(graphicalLetter);
    }

    private static final Map<String, String> letters = new HashMap<String, String>();

    static {
        // @formatter:off
        letters.put(
" # \n" +
"# #\n" +
"###\n" +
"# #\n" +
"# #\n"
, "A");

        letters.put(
...
, "E");
        // @formatter:on
    }
}

这样一来,图形表示就可以放在一个地方,并且不会弄乱代码的其他任何部分,同时仍可以被人眼识别。

可以创建一种算法,例如,首先查看整个#的数量,然后查看第一列或第一行中哈希的数量,然后以这种方式找到字母,但是这可能会过于复杂,难以阅读/理解。


为进一步简化可读性,您甚至可以考虑从地图的条目中删除\n,并通过getLetter方法自动将其删除。

答案 1 :(得分:0)

您可以创建一个switch用作查找表,该键的键具有当前每个Map的键和其值,而不是在方法内部使用case来解决问题。分别是字母。

Map<String, String> lookup = new HashMap<>(26);
lookup.put(" ASCII art here ", " letter ");
// ...

然后可以将查找图与简单的`get(asciiArt)一起使用以返回所请求的字母。

该地图可以是最终类的成员,您可以将其填充到类构造函数中。

public class AsciiConverter {

    private final Map<String, String> letters;

    public AsciiConverter() {
        letters = new HashMap<>(26); // however many letters you need, maybe more than 26 if you're using another alphabet or special chars
        // populate
       letters.put(" # \n# #\n###\n# #\n# #\n", "A");
       // same thing for all the other letters
    }

    public String toLetter(String ascii) {
         return letters.getOrDefault(ascii, "");
    }
}

答案 2 :(得分:0)

您可以将您的每项ascii艺术分解为几行。

B, E, D, F, H, K, L, M, N, P, Q, R, T, U, V, W, X, Y, Z

在第一行的位置1中都应该有一个字符

E, F, H, K, M, N, T, U, V, W, X, Y, Z

第一行的最后一个位置会出现一个字符

E, H, K, M, N, W, X, Z

右下角会出现一个字符

在这些E and Z中,第一行的中间位置没有字符

我确定您可以继续执行此操作以识别每个字母。但是使用地图解决方案可能更快。

如果您尝试以不同的“字体”或样式阅读ASCII艺术作品,我的态度会更好