在JAVA中,是否有任何解决方案可以将字符串中的整数转换为ASCII字符?

在JAVA中,是否有任何解决方案可以将字符串中的整数转换为ASCII字符?,java,Java,问题:我有String=“T104I115S42C111M112U116E114”我只想将整个字符串转换为字母。i、 e(字符串奇数位置的数字应转换为相应的ASCII字符),以便其输出看起来像“Thisss*计算机”? 有人能为我提供解决方案吗?我已经尝试了下面的代码,但不适用于其他部分/ 输入:T104i115*115s42c111m112u116e114 输出:这台*ss*计算机 private static String decodeAscii(String decrpt) {

问题:我有String=“T104I115S42C111M112U116E114”我只想将整个字符串转换为字母。i、 e(字符串奇数位置的数字应转换为相应的ASCII字符),以便其输出看起来像“Thisss*计算机”? 有人能为我提供解决方案吗?我已经尝试了下面的代码,但不适用于其他部分/

输入
T104i115*115s42c111m112u116e114
输出
这台*ss*计算机

private static String decodeAscii(String decrpt) {
        // TODO Auto-generated method stub
        String check=decrpt;
        String str="";
        String num="";
        for(int i=0;i<check.length();i++){
            if((check.charAt(i)>='A' && check.charAt(i)<='Z')||(check.charAt(i)>='a' && check.charAt(i)<='z')) {
                str=str+check.charAt(i);
            }
            else if(!((check.charAt(i)>='A' && check.charAt(i)<='Z')||(check.charAt(i)>='a' && check.charAt(i)<='z') || (check.charAt(i)>='0' && check.charAt(i)<='9'))) {
                str=str+check.charAt(i);
            }
            else{
                if(check.charAt(i)>='0' && check.charAt(i)<='9') {
                    num+=check.charAt(i);
                    while(true){
                        if(check.charAt(i)>='0' && check.charAt(i)<='9') {
                            num+=check.charAt(i);
                            i++;
                        }
                        else {
                            break;
                        }
                    }
                    
                }
                int number = Integer.parseInt(num);
                char c =(char)number;
                str=str+c;  
            }
            
        }
        return str;
        
    }
私有静态字符串解码ASCII(字符串递减){
//TODO自动生成的方法存根
字符串检查=递减;
字符串str=“”;
字符串num=“”;

对于(int i=0;i='A'&&check.charAt(i)='A'&&check.charAt(i)='A'&&check.charAt(i)='A'&&check.charAt(i)='0'&&check.charAt(i)='0'&&check.charAt(i)='0'&&check.charAt(i)最好使用正则表达式将输入字符串拆分为“数字”和“非数字”组块,然后将“数字”组块转换为字符并将其连接起来

使用流API的示例实现:

String str=“T104i115*115s42c111m112u116e114”;
Pattern=Pattern.compile(“(\\D |\\D+)”);//一个组由1个非数字或几个数字组成
已解码字符串=模式匹配器(str)
.results()//自Java 9以来的流
.map(m->m.group(1))//流
.map->s.matches(\\d+)(char)Integer.parseInt:s.charAt(0))//流
.collect(StringBuilder::new,(builder,c)->builder.append((char)c),StringBuilder::append)
.toString();
系统输出打印项次(解码);
输出:

This*ss*computer

是的,这是可能的。这是我多次测试中的一次的测试结果

Input:  T104i115*115s42c111m112u116e114
Tokens: T, 104, i, 115, *, 115, s, 42, c, 111, m, 112, u, 116, e, 114
Output: This*ss*computer
解决任何复杂问题的一个好方法是将其分解为多个步骤。您不断分解,直到您确信您可以编写每个步骤

在编写步骤的过程中,您需要运行测试,以确保获得预期的结果。编写所有代码,然后进行测试,这肯定会让人发疯。我不是一个很好的开发人员,我可以在不进行测试的情况下编写数百行代码。我尝试对我编写的每十到二十行代码运行一次测试

正如您从测试输出中可以猜到的,我将输入解析为标记,然后将数字标记转换为ASCII字符。通过将问题分解为步骤,我可以集中精力纠正每个步骤

我选择编写自己的解析器,而不是使用复杂的正则表达式。我希望我的解析器代码足够简单易懂

下面是完整的可运行代码

import java.util.ArrayList;
import java.util.List;

public class ASCIIDecoder {

    public static void main(String[] args) {
        ASCIIDecoder a = new ASCIIDecoder();
        String input = "T104i115*115s42c111m112u116e114";
        System.out.println("Input:  " + input);
        System.out.println("Output: " + a.decodeASCII(input));
    }
    
    private String decodeASCII(String decrpt) {
        List<String> parts = parseString(decrpt);
        printList(parts);
        return processList(parts);
    }

    private void printList(List<String> parts) {
        System.out.print("Tokens: ");
        for (int i = 0; i < parts.size(); i++) {
            System.out.print(parts.get(i));
            if (i < (parts.size() - 1)) {
                System.out.print(", ");
            }
        }
        System.out.println();
    }
    
    private List<String> parseString(String decrpt) {
        List<String> output = new ArrayList<>();
        StringBuilder builder = new StringBuilder();
        boolean isDigit = true;
        
        for (int i = 0; i < decrpt.length(); i++) {
            char c = decrpt.charAt(i);
            if (c >= '0' && c <= '9') {
                if (!isDigit) {
                    add(output, builder);
                    builder.delete(0, builder.length());
                }
                builder.append(c);
                isDigit = true;
            } else {
                if (isDigit) {
                    add(output, builder);
                    builder.delete(0, builder.length());
                }
                builder.append(c);
                isDigit = false;
            }
        }
        
        add(output, builder);
        
        return output;
    }

    private void add(List<String> output, StringBuilder builder) {
        if (builder.length() > 0) {
            output.add(builder.toString());
        }
    }
    
    private String processList(List<String> parts) {
        StringBuilder builder = new StringBuilder();
        
        for (int i = 0; i < parts.size(); i++) {
            int value = valueOf(parts.get(i));
            if (value < 0) {
                builder.append(parts.get(i));
            } else {
                char c = (char) value;
                builder.append(c);
            }
        }
        
        return builder.toString();
    }
    
    private int valueOf(String number) {
        try {
            return Integer.valueOf(number);
        } catch (NumberFormatException e) {
            return -1;
        }
    }

}
import java.util.ArrayList;
导入java.util.List;
公共类ASCIIDecoder{
公共静态void main(字符串[]args){
ASCIIDecoder a=新的ASCIIDecoder();
字符串输入=“T104i115*115s42c111m112u116e114”;
System.out.println(“输入:”+输入);
System.out.println(“输出:+a.decodescii(输入));
}
专用字符串解码ASCII(字符串递减){
列表部分=解析字符串(decrpt);
打印列表(零件);
退货工艺清单(零件);
}
专用作废打印列表(列出零件){
系统输出打印(“令牌:”);
对于(int i=0;i='0'&&c 0){
add(builder.toString());
}
}
私有字符串进程列表(列出部分){
StringBuilder=新的StringBuilder();
对于(int i=0;i
仍然存在一些漏洞;是否总是有偶数字母,它们可能不是数字

我假设采用单字节编码,拉丁-1,限制可能的数字

    String str = "T104i115115s42c111m112u116e114"; // Notice, not 115*115
    Pattern pattern = Pattern.compile("([3-9]\\d|[1-2]\\d\\d)"); 
    // ASCII 32-99, 100-255
    String result = pattern.matcher(str)
            .replaceAll(mr -> {
                int c = Integer.parseInt(mr.group());
                return new String(new byte[] { (byte)c }, 0, 1,
                        StandardCharsets.ISO_8859_1);
            });

根据具体的规则,它仍然不能保证完美的解决方案。

我发现这段代码有很多问题。通过使用可视化调试器单步执行代码,可以很容易地找到其中的一些问题。你做到了吗?你为什么希望其他人为你做调试工作?熟悉可视化调试器,并花费时间一步一步地检查你的代码。分析它在每一步应该做什么,然后看看它实际做了什么。当它做了你不期望的事情时,找出原因…我认为你可以通过立即检查一个数字来简化你的代码,并通过将它们添加到结果字符串中来以相同的方式处理所有非数字。你的
如果
语句肯定比任何情况下都要复杂。进入下一个阶段时,请注意保留变量的状态,特别是
i
num
。这是否回答了您的问题?如果使用Java 9+解决方案,使用该方法会更好:
decoded=Pattern.compile(“\\d+”).matcher(str).replaceAll(m->Character.toString((char)Integer.parseInt(m.group()));
。在Java 11+中,您可以删除
(char)
强制转换以获得对BMP之外的字符的支持,例如表情符号。