多次执行 String.replaceAll 忽略之前替换的字母 Java
Doing String.replaceAll multiple times ignoring previous letters replaced Java
我有一个问题,现在归结为有两个数组列表,其中字母表中的字母按某种顺序排列。我想将字符串中的所有字母替换为第一个 arrraylist 中的字母和第二个中的字母(即 arraylist 1 的索引 1 处的元素将替换为字符串中 arraylist 2 中的元素 1)。
如果数组列表 1 为 [a,b,c,d],数组列表 2 为 [b,a,d,c]。和一个由这些字母组成的字符串,我想用 b、b、a ...等替换 a 但是当我用 b 替换 a 时,下一个替换是 b 和 a,所以所有的 b 和 a都改成a了。我想不出避免这个问题的方法。 (我的问题是使用了所有字母表中的字母和一个巨大的文本文件。)
编辑:
我读回了那篇文章,并且解释得令人震惊。这里有一些代码可以帮助解释。
假设我们有 ArrayList1 = [r, g, n, b, v, a, u, f, e, q, y, h, z, j, p, l, s, t, c, o, i, x , w, k, d, m]
ArrayList2 = [e, t, a, o, i, n, s, r, h, d, l, u, c, m, f, y, w, g, p, b, v, k, x, q, j, z]
假设我们还有一个字符串要按照我上面提到的方式使用这 2 个数组列表进行解码:
String s = "Gb Fureybpx Ubyzrf fur vf nyjnlf gur jbzna. V unir fryqbz
urneq uvz zragvba ure haqre nal bgure anzr. Va uvf rlrf fur rpyvcfrf
naq cerqbzvangrf gur jubyr bs ure frk.";
for(int i =0;i < ArrayList.size() ; i++){
s = s.replaceAll(ArrayList1.get(i),ArrayList2.get(i);
}
这将无法正常工作,因为 r -> e 以及稍后的 e -> h 等等。这是我试图避免的,但我正在努力想办法做到这一点。
没有像你想的那样使用 regex 的好方法
如果您的输入仅限于所有 lowercase/uppercase 个字母,您可以用它做一些技巧
String encode(String in, ArrayList<String> a, ArrayList<String> b) //in is lowercase
{
in = in.toUpperCase();
for(int i = 0; i < a.size(); i++)
in = in.replaceAll(a.get(i).toUpperCase(), b.get(i));
return in;
}
如果您要处理完整的字母表,使用数组索引可能更有意义
替换字符串将编码为“abcd...wxyz
”
String encode(String in, String replacements)
{
StringBuilder out = new StringBuilder();
for(char c : in.toCharArray())
out.append(replacements.charAt(c - 'a')); //can swap replacements with an array/ArrayList: replacements[c - 'a'] and replacements.get(c - 'a'a)
return out.toString();
}
encode("test", "abcdefghijklmnopqrstuvwxyz") = test
encode("test", "bcdefghijklmnopqrstuvwxyza") = uftu
如果您必须使用 ArrayList
代替:
String encode(String in, ArrayList<String> a, ArrayList<String> b)
{
StringBuilder out = new StringBuilder();
for(char c : in.toCharArray())
out.append(b.get(a.indexOf("" + c))); //should do error checking if the input contains characters not in a
return out.toString();
}
我有一个问题,现在归结为有两个数组列表,其中字母表中的字母按某种顺序排列。我想将字符串中的所有字母替换为第一个 arrraylist 中的字母和第二个中的字母(即 arraylist 1 的索引 1 处的元素将替换为字符串中 arraylist 2 中的元素 1)。
如果数组列表 1 为 [a,b,c,d],数组列表 2 为 [b,a,d,c]。和一个由这些字母组成的字符串,我想用 b、b、a ...等替换 a 但是当我用 b 替换 a 时,下一个替换是 b 和 a,所以所有的 b 和 a都改成a了。我想不出避免这个问题的方法。 (我的问题是使用了所有字母表中的字母和一个巨大的文本文件。)
编辑:
我读回了那篇文章,并且解释得令人震惊。这里有一些代码可以帮助解释。 假设我们有 ArrayList1 = [r, g, n, b, v, a, u, f, e, q, y, h, z, j, p, l, s, t, c, o, i, x , w, k, d, m]
ArrayList2 = [e, t, a, o, i, n, s, r, h, d, l, u, c, m, f, y, w, g, p, b, v, k, x, q, j, z]
假设我们还有一个字符串要按照我上面提到的方式使用这 2 个数组列表进行解码:
String s = "Gb Fureybpx Ubyzrf fur vf nyjnlf gur jbzna. V unir fryqbz
urneq uvz zragvba ure haqre nal bgure anzr. Va uvf rlrf fur rpyvcfrf
naq cerqbzvangrf gur jubyr bs ure frk.";
for(int i =0;i < ArrayList.size() ; i++){
s = s.replaceAll(ArrayList1.get(i),ArrayList2.get(i);
}
这将无法正常工作,因为 r -> e 以及稍后的 e -> h 等等。这是我试图避免的,但我正在努力想办法做到这一点。
没有像你想的那样使用 regex 的好方法
如果您的输入仅限于所有 lowercase/uppercase 个字母,您可以用它做一些技巧
String encode(String in, ArrayList<String> a, ArrayList<String> b) //in is lowercase
{
in = in.toUpperCase();
for(int i = 0; i < a.size(); i++)
in = in.replaceAll(a.get(i).toUpperCase(), b.get(i));
return in;
}
如果您要处理完整的字母表,使用数组索引可能更有意义
替换字符串将编码为“abcd...wxyz
”
String encode(String in, String replacements)
{
StringBuilder out = new StringBuilder();
for(char c : in.toCharArray())
out.append(replacements.charAt(c - 'a')); //can swap replacements with an array/ArrayList: replacements[c - 'a'] and replacements.get(c - 'a'a)
return out.toString();
}
encode("test", "abcdefghijklmnopqrstuvwxyz") = test
encode("test", "bcdefghijklmnopqrstuvwxyza") = uftu
如果您必须使用 ArrayList
代替:
String encode(String in, ArrayList<String> a, ArrayList<String> b)
{
StringBuilder out = new StringBuilder();
for(char c : in.toCharArray())
out.append(b.get(a.indexOf("" + c))); //should do error checking if the input contains characters not in a
return out.toString();
}