Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用相同的字符索引替换另一个字符串中的字符_Java - Fatal编程技术网

Java 用相同的字符索引替换另一个字符串中的字符

Java 用相同的字符索引替换另一个字符串中的字符,java,Java,我试图搜索并显示字符串中的未知字符。两个字符串的长度均为12 例如: String s1 = "1x11222xx333"; String s2 = "111122223333" 程序应检查s1中由x | x表示的所有未知数,并获取s2中的相关字符,并用相关字符替换x | x 到目前为止,我的代码仅用s2中的相关字符替换了第一个x | x,但用第一个x | x的字符打印了其余未知项的副本 这是我的密码: String VoucherNumber = "1111x22

我试图搜索并显示字符串中的未知字符。两个字符串的长度均为12

例如:

     String s1 = "1x11222xx333";
     String s2 = "111122223333"
程序应检查s1中由x | x表示的所有未知数,并获取s2中的相关字符,并用相关字符替换x | x

到目前为止,我的代码仅用s2中的相关字符替换了第一个x | x,但用第一个x | x的字符打印了其余未知项的副本

这是我的密码:

    String VoucherNumber = "1111x22xx333";
    String VoucherRecord = "111122223333";
    String testVoucher = null;
    char x = 'x'|'X';

    System.out.println(VoucherNumber); // including unknowns


            //find x|X in the string VoucherNumber
            for(int i = 0; i < VoucherNumber.length(); i++){

                   if (VoucherNumber.charAt(i) == x){

                       testVoucher = VoucherNumber.replace(VoucherNumber.charAt(i), VoucherRecord.charAt(i));

                   }


            }

                     System.out.println(testVoucher); //after replacing unknowns
        }


    }

我一直喜欢使用StringBuilder,因此这里有一个使用它的解决方案:

private static String replaceUnknownChars(String strWithUnknownChars, String fullStr) {
    StringBuilder sb = new StringBuilder(strWithUnknownChars);
    while ((int index = Math.max(sb.toString().indexOf('x'), sb.toString().indexOf('X'))) != -1) {
        sb.setCharAt(index, fullStr.charAt(index));
    }

    return sb.toString();
}
这很简单。创建一个新的字符串生成器。而在字符串生成器indexOf'x'!=-1,获取索引和setCharAt。

您使用的是String.replacechar,char的方式不对,文档说

返回一个新字符串,该字符串由newChar替换该字符串中所有出现的oldChar生成

因此,如果您有多个字符,这将用相同的值替换每个字符

您只需要更改特定位置的字符,为此,最简单的方法是使用您可以使用的字符数组,从这里,您可以使用相同的逻辑

当然,您可以使用查找特定字符的索引

注:字符c='x'|'x';不会给你预期的结果。这将执行一个二进制操作,给出一个不是您想要的值

如果其中一位为1,OR将返回1

0111 1000 (x)
0101 1000 (X)
OR
0111 1000 (x)
但是结果将是一个整数,每个数值操作返回的最小值为一个整数,您可以找到有关该值的更多信息


这里有两种解决方案,要么使用两个变量,要么使用一个数组,或者如果可以的话,使用一个use only char c='x'

字符串在Java中是不可变的。不能替换字符串中的字符,必须构建新字符串,或使用可变的StringBuilder;您想在这里做什么?char x='x'|'x'//在输入任何一个x | x时处理用户输入。@很遗憾,您只能在一个char中存储一个charx'|'x'计算为两个字符值'x'和'x'的按位或,等于120或以字符形式,简称为'x'。如果你想比较两个字符,你必须在你的If条件下做两个比较;看一看。它将替换该字符的所有出现,而不仅仅是字符串上的一个OUTPERCase在极端情况下是危险的。例如,在大多数语言环境中,如果字符串包含德语字母ß,它将变为SS,两个字符,因此将移动以下字符的索引,因此可能在错误的索引处设置字符。而只是更改您正在查看的字符的大小写。或者只搜索小x和大写x。@Sweeper错误时机^^我刚刚删除了评论,因为我不喜欢每次都搜索这两个词的想法,你的双循环将只检查好的时间段。将值保存为整数;而int index=Math.max…!=有趣的是,char c='x'|'x';可以编译为语句。“我同意你的看法,那是没有道理的。该死,不正常。。。这是一个简单的运算符,因此确实需要编译,但返回一个int,但没有给出预期的结果。幸运的是:0111 1000 | 0101 1000仍然给出0111 1000 x,因此它可以使用小写测试。在问题中添加这些信息,但有点含糊不清——这可能是好的,也可能是坏的:它可能会欺骗某人,让他们认为这是有效的,我个人更希望它没有编译。@OleV.V。这不是因为结果是整数。但是字符只是数值,所以我理解JVM在这方面的作用,当然,使用字符值而不是数值可以防止这种情况。