StringBuffer 的替换方法无法正常工作
StringBuffer's replace method is not working as it's supposed to be
下面是一段代码,如果我在数组 (arr) 中遇到字母 O,那么我必须用“.”替换数组 (newArr) 的相同索引。连同其相邻索引,即索引 (i,j)、(i +- 1,j) 和 (i, j +- 1) 需要替换为“.”。
考虑数组(arr)的输入:
6 7
.......
...O...
.......
.......
.......
.......
我应该用数组(newArr)得到什么输出:
OOO.OOO
OO...OO
OOO.OOO
OOOOOOO
OOOOOOO
OOOOOOO
我得到的输出:
OO...OO
OO...OO
OO...OO
OO...OO
OO...OO
OO...OO
PS:我知道一些极端情况,如果我们在索引中得到一个 O,这将导致 ArrayIndexOutOfBound 异常。请考虑上面的例子。
import java.util.*;
public class Pattern{
public static void main(String[] args){
Scanner sc= new Scanner(System.in);
int R= sc.nextInt(); // Takes input for Rows
int C= sc.nextInt(); // Takes input for Coloumn
StringBuffer[] arr= new StringBuffer[R]; // Array of type StringBuffer to which input is given.
StringBuffer[] newArr= new StringBuffer[R]; // Array of type StringBuffer which shall be filled with alphabet "O".
for(int i=0; i<R; i++)
arr[i]= new StringBuffer(sc.next()); // Input given to array arr.
StringBuffer s= new StringBuffer(); // A new stringBuffer
for(int i=0; i<C; i++)
s.append("O"); // appends the required amount of alphabet O for newArr.
Arrays.fill(newArr, s); // fills the array with s(which contains only alphabet O).
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
if(arr[i].charAt(j) == 'O'){
newArr[i].replace(j, j+1, "."); // replaces "O" with "." in newArr.
newArr[i].replace(j+1, j+2, "."); // replaces "O" with "." in newArr.
newArr[i].replace(j-1, j, "."); // replaces "O" with "." in newArr.
newArr[i+1].replace(j, j+1, "."); // replaces "O" with "." in newArr.
newArr[i-1].replace(j, j+1, "."); // replaces "O" with "." in newArr.
}
}
}
for(int i=0; i<R; i++)
System.out.println(newArr[i]); // printing the new replaced array.
}
}
你用 Arrays.fill(Object[], Object)
填充 newArr
Assigns the specified Object reference to each element of the specified array of Objects
您在每个单元格中都放置了相同的实例。因此,您在这里使用 StringBuffer
的 1 个实例。这意味着如果你在一个单元格中进行更新,每个单元格都会有相同的更新(你只使用一个对象)
您需要为每个单元格创建一个副本(在数组上循环自己)。
for(int i = 0; i < newArr.length; ++i){
newArr[i] = new StringBuffer(s.toString());
}
下面是一段代码,如果我在数组 (arr) 中遇到字母 O,那么我必须用“.”替换数组 (newArr) 的相同索引。连同其相邻索引,即索引 (i,j)、(i +- 1,j) 和 (i, j +- 1) 需要替换为“.”。
考虑数组(arr)的输入:
6 7
.......
...O...
.......
.......
.......
.......
我应该用数组(newArr)得到什么输出:
OOO.OOO
OO...OO
OOO.OOO
OOOOOOO
OOOOOOO
OOOOOOO
我得到的输出:
OO...OO
OO...OO
OO...OO
OO...OO
OO...OO
OO...OO
PS:我知道一些极端情况,如果我们在索引中得到一个 O,这将导致 ArrayIndexOutOfBound 异常。请考虑上面的例子。
import java.util.*;
public class Pattern{
public static void main(String[] args){
Scanner sc= new Scanner(System.in);
int R= sc.nextInt(); // Takes input for Rows
int C= sc.nextInt(); // Takes input for Coloumn
StringBuffer[] arr= new StringBuffer[R]; // Array of type StringBuffer to which input is given.
StringBuffer[] newArr= new StringBuffer[R]; // Array of type StringBuffer which shall be filled with alphabet "O".
for(int i=0; i<R; i++)
arr[i]= new StringBuffer(sc.next()); // Input given to array arr.
StringBuffer s= new StringBuffer(); // A new stringBuffer
for(int i=0; i<C; i++)
s.append("O"); // appends the required amount of alphabet O for newArr.
Arrays.fill(newArr, s); // fills the array with s(which contains only alphabet O).
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
if(arr[i].charAt(j) == 'O'){
newArr[i].replace(j, j+1, "."); // replaces "O" with "." in newArr.
newArr[i].replace(j+1, j+2, "."); // replaces "O" with "." in newArr.
newArr[i].replace(j-1, j, "."); // replaces "O" with "." in newArr.
newArr[i+1].replace(j, j+1, "."); // replaces "O" with "." in newArr.
newArr[i-1].replace(j, j+1, "."); // replaces "O" with "." in newArr.
}
}
}
for(int i=0; i<R; i++)
System.out.println(newArr[i]); // printing the new replaced array.
}
}
你用 Arrays.fill(Object[], Object)
newArr
Assigns the specified Object reference to each element of the specified array of Objects
您在每个单元格中都放置了相同的实例。因此,您在这里使用 StringBuffer
的 1 个实例。这意味着如果你在一个单元格中进行更新,每个单元格都会有相同的更新(你只使用一个对象)
您需要为每个单元格创建一个副本(在数组上循环自己)。
for(int i = 0; i < newArr.length; ++i){
newArr[i] = new StringBuffer(s.toString());
}