Java 从其图形表示中获取字母(a-Z)

Java 从其图形表示中获取字母(a-Z),java,ascii,ascii-art,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":

如何从包含其图形表示的字符串中获取字符(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 '?';

是否有一种算法或一些ASCII艺术技巧可以使用java来实现这一点?

您可以创建一个
映射来用作查找表,其键具有当前每个
大小写,其值是相应的字母,而不是在方法内部使用
开关来处理问题

Map<String, String> lookup = new HashMap<>(26);
lookup.put(" ASCII art here ", " letter ");
// ...
Map lookup=newhashmap(26);
lookup.put(“ASCII艺术在此”,“字母”);
// ...
然后,可以将查找映射与简单的`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, "");
    }
}
公共类ASCICONVERTER{
私人最终地图信件;
公共ASCIConverter(){
letters=new HashMap(26);//无论您需要多少个字母,如果您使用的是其他字母表或特殊字符,可能超过26个
//填充
字母。放入(“#\n##\n###\n##\n#\n”,“A”);
//其他字母也是一样
}
公共字符串toLetter(字符串ascii){
返回字母.getOrDefault(ascii,“”);
}
}

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

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
    }
}
公开课信函{
公共字符串getLetter(字符串图形化设置器){
返回信件。获取(graphicalLetter);
}
私有静态最终映射字母=new HashMap();
静止的{
//@formatter:off
字母(
“#\n”+
“##\n”+
“###\n”+
“##\n”+
“##\n”
,“A”);
字母(
...
,“E”);
//@formatter:on
}
}
这样一来,图形表示就可以放在一个地方,并且不会使代码的任何其他部分变得杂乱无章,同时仍然可以被人眼读取

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



<> P>为了进一步简化可读性,你甚至可以考虑从地图的条目中删除<代码> \n>代码>并自动删除它们在<代码> GETNoEng/<代码>方法中。

< p>你可以把你的ASCII艺术中的每一个都分解成线。< /P>
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和z 具有在第一行

的中间位置的字符。
E, H, K, M, N, W, X, Z
我相信你可以继续这样做来识别每个字母。但是使用地图解决方案可能会更快


如果您尝试以不同的“字体”或样式阅读ASCII艺术,我的答案会更好。

您的代码是否也应该在某个时候向另一个方向转换?如果是这种情况,则必须存储所有“图形表示”无论如何,我可以使用双向映射或其他数据结构来存储和查询信件。感谢您的评论luk,但这只是单向的。我只想在有人输入该信件的图形表示形式时打印该信件。我会将每个信件存储在一个文件中,而不是一个字符串。在开始时加载所有文件谢谢william的回答,但在这种情况下,我必须手动键入地图中所有字母的形状。当我收到一个ascii码作为输入时,我该如何将其与地图中的设计相匹配?如果我的问题有点傻,很抱歉。是的,但是你必须以这样或那样的方式定义ASCII到字母的映射,或者通过其他人为你做的外部库,或者通过自己做。据我所知,没有其他方法可以解决这个问题。谢谢你们的帮助,klonq luk和@william。请在下面找到答案,因为这里的答案是由于一些无用的家伙而锁定的:但是如果是luk,我可能不得不为所有26封信这么做?还有其他自动方式吗?@Rohit19j91没有。我想你需要5分钟才能把它们全部输入。在发布此问题后,您本可以这样做5次以上。如果你想正确地手动和单元测试你的代码,你必须知道所有不同的字母。Luk:让我用这种方式来框架,在一个名为printChar的类AsciiArt中有一个函数,它在多行和多列上显示从a到Z的一个ASCII字符,现在我们想反转操作;从图形表示字符串abc=AsciiArt.printChar('a')中获取字符;System.out.println(“Corr to############char c=A.scanChar(abc);System.out.println(Should corr to A)@luk2302说没有自动完成这项工作的方法是不对的:您可以创建一个位图,在位图中绘制一个字符,然后从设置的位构造一个字符串。但是,当然,这比手工编写要花费更长的时间(一次)。谢谢你们的帮助,klonq luk和@william。请在下面找到答案,因为这里的答案被一些无用的家伙锁定了:谢谢你们的帮助,klonq luk和@william。请在下面找到答案,因为这里的答案由于一些无用的家伙而被锁定: