如何从包含图形表示形式的字符串中获取字符(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艺术技巧来做到这一点?
答案 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艺术作品,我的态度会更好