gpt4 book ai didi

Java 替换未按预期工作

转载 作者:行者123 更新时间:2023-12-01 20:26:25 24 4
gpt4 key购买 nike

这是代码:

public class Test {
public static void main(String argv[]) {
String original="r(1,2,1)=r(1,2,0)+r(1,1,0)r(1,1,0)*r(1,2,0)";
StringTest strtest=new StringTest();
strtest.setX(original.replace("r(1,2‚0)", "TEST"));
System.out.println(original.replace("r(1,2,0)", "TEST"));
System.out.println(strtest);
}
}

class StringTest {
String x=null;

public StringTest() {}

public String toString() {
return x;
}

public void setX(String other) {
x=other;
}
}

运行此命令会产生输出:

r(1,2,1)=TEST+r(1,1,0)r(1,1,0)*TEST
r(1,2,1)=r(1,2,0)+r(1,1,0)r(1,1,0)*r(1,2,0)

为什么 strtest 中的 x 等于 original 字符串,而 r(1,2,0) 未被替换,如何修复是吗?

编辑:

为什么它在这段代码中不起作用,grep 在这个文件中找不到任何非 ascii 符号:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Collections;
import java.util.regex.Pattern;
import java.util.Arrays;
import java.io.*;

public class DFK {
static ArrayList<Path> done = new ArrayList<Path>();

public static void print() {
for(Path i: done) {
//System.out.println(i+" "+i.isConverted());
if(i.isConverted()) {
System.out.println(i.getConverted());
}
}
}

public static void develop() {
if(done.get(0).getKP1() > 0) {
DFK.add(new Path(done.get(0).getP(), done.get(0).getQ(), done.get(0).getK()));
DFK.add(new Path(done.get(0).getP(), done.get(0).getKP1(), done.get(0).getK()));
DFK.add(new Path(done.get(0).getKP1(), done.get(0).getKP1(), done.get(0).getK()));
DFK.add(new Path(done.get(0).getKP1(), done.get(0).getQ(), done.get(0).getK()));
}
}

public static void add(Path x) {
boolean exists = (done.indexOf(x)==-1 ? false : true);
if(exists == false) {
done.add(x);
if(x.getKP1() >= 2) {
DFK.add(new Path(x.getP(), x.getQ(), x.getK()));
DFK.add(new Path(x.getP(), x.getKP1(), x.getK()));
DFK.add(new Path(x.getKP1(), x.getKP1(), x.getK()));
DFK.add(new Path(x.getKP1(), x.getQ(), x.getK()));
}
}
}

public static void main(String argv[]) throws IOException {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
int p = 0, q = 0, kp1 = 0;
Scanner in = new Scanner(System.in);
System.out.print("p = ");p = in.nextInt();
System.out.print("q = ");q = in.nextInt();
System.out.print("k+1 = ");kp1 = in.nextInt();

System.out.print("\n");
String rkzero[][] = new String[q][q];
for(int i=0; i<q ; i++) {
for(int j=0; j<q ; j++) {
System.out.print(String.format("r(%d,%d,0): ", i+1, j+1));
rkzero[i][j]=input.readLine();
}
}

done.add(new Path(p, q, kp1));
DFK.develop();
Collections.sort(done);

for(int z=0; z<q ; z++) {
for(int j=0; j<q ; j++) {
for(Path i: done) {
String reg = String.format("r(%d,%d,0)",z+1,j+1);
i.setConverted(i.toString().replace( reg , rkzero[z][j])); //HERE IS THE PROBLEM
}
}
}
System.out.print("\n");
DFK.print();
}
}

class Path implements Comparable<Path> {
int p,q,kplus1,k;
String converted = null;

public int getP() {
return p;
}

public int getQ() {
return q;
}

public int getKP1() {
return kplus1;
}

public int getK() {
return k;
}

public Path(int a, int b, int c) {
super();
p = a;
q = b;
kplus1 = c;
k = c-1;
}

public boolean equals(Object obj) {
if (obj == null) {
return false;
}

if (!Path.class.isAssignableFrom(obj.getClass())) {
return false;
}

final Path other = (Path) obj;
if(other.p == this.p && other.q == this.q && other.kplus1 == this.kplus1)
return true;
return false;
}

public int compareTo(Path other) {
return other.kplus1-kplus1;
}

public String toString() {
return String.format("r(%d,%d,%d)=r(%d,%d,%d)+r(%d,%d,%d)r(%d,%d,%d)*r(%d,%d,%d)",p,q,kplus1,p,q,k,p,kplus1,k,kplus1,kplus1,k,kplus1,q,k);
}

public void setConverted(String x) {
converted = new String(x);
}

public String getConverted() {
return converted;
}

public boolean isConverted() {
if(converted == null)
return false;
return true;
}
}

这是输出:

p = 1
q = 2
k+1 = 2

r(1,1,0): 0
r(1,2,0): 1
r(2,1,0): 1
r(2,2,0): 0

r(1,2,2)=r(1,2,1)+r(1,2,1)r(2,2,1)*r(2,2,1)
r(1,2,1)=r(1,2,0)+r(1,1,0)r(1,1,0)*r(1,2,0)
r(2,2,1)=0+r(2,1,0)r(1,1,0)*r(1,2,0)

它只用 0 替换 r(2,2,0),没有其他任何内容,我从中复制了上一个问题,但我在这个问题中找不到任何非 asci 符号。

最佳答案

第一个“r(1,2‚0)”字符串中的最后一个逗号不是标准逗号(十进制值为 44)。相反,它是 another special character ,但看起来完全一样,十进制值为 8218。只需删除该字符并用逗号替换它,它就会按预期工作。

检测此类奇怪字符的一个简单方法是打印它们的十进制值。例如:

String target = "r(1,2‚0)";
System.out.println(Arrays.toString(target.chars().toArray()));

打印内容

[114, 40, 49, 44, 50, 8218, 48, 41]

您可以在这里清楚地看到有问题的字符超出了基本 ASCII 字符的范围。

关于Java 替换未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43837843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com