Java StringBuffer';s replace方法无法正常工作';应该是

Java StringBuffer';s replace方法无法正常工作';应该是,java,arrays,replace,stringbuffer,Java,Arrays,Replace,Stringbuffer,下面是一个代码,如果我在数组(arr)中遇到字母O,那么我必须将数组的相同索引(newArr)替换为“.”以及它的相邻索引,即索引(I,j),(I+-1,j)和(I,j+-1)需要替换为“.” 考虑阵列(arr)的此输入: 使用数组(newArr)应该获得什么输出: 我得到的输出: OO...OO OO...OO OO...OO OO...OO OO...OO OO...OO PS:我知道一些极端情况,如果我们在索引中得到一个O,这将导致ArrayIndexOutOfBound异常。

下面是一个代码,如果我在数组(arr)中遇到字母O,那么我必须将数组的相同索引(newArr)替换为“.”以及它的相邻索引,即索引(I,j),(I+-1,j)和(I,j+-1)需要替换为“.”

考虑阵列(arr)的此输入:

使用数组(newArr)应该获得什么输出:

我得到的输出:

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.
    }
}
import java.util.*;
公共阶级模式{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
int R=sc.nextInt();//接受行的输入
int C=sc.nextInt();//为column获取输入
StringBuffer[]arr=new StringBuffer[R];//指定输入的StringBuffer类型的数组。
StringBuffer[]newArr=newStringBuffer[R];//StringBuffer类型的数组,该数组应以字母“O”填充。

对于(int i=0;iSicne,您可以在
newArr
中填入

将指定的对象引用指定给指定对象数组的每个元素

您在每个单元格中放置了相同的实例。因此,您在此处使用的是
StringBuffer
的一个实例。这意味着,如果您在一个单元格中执行更新,则每个单元格将具有相同的更新(您仅使用一个对象)

您需要为每个单元格创建一个副本(在阵列上循环)

for(int i=0;i
您可以在
newArr
中填入

将指定的对象引用指定给指定对象数组的每个元素

您在每个单元格中放置了相同的实例。因此,您在此处使用的是
StringBuffer
的一个实例。这意味着,如果您在一个单元格中执行更新,则每个单元格将具有相同的更新(您仅使用一个对象)

您需要为每个单元格创建一个副本(在阵列上循环)

for(int i=0;i
为什么不在该代码中简单地
char[][
呢?我不认为这里需要
StringBuffer
。使用
fill
将实例放在每个单元格中,而不是一个副本。因此,在
newArr
的每个单元格中都有
s
,相同的引用。为什么不简单地
char[]
在该代码中?我不认为这里需要
StringBuffer
。使用
fill
将实例放在每个单元格中,而不是一个副本。因此,在
newArr
的每个单元格中都有
s
,相同的引用。或者,你可以用更简单、更有效的方法来做,只需创建一个二维数组。循环一下h您当前的算法,您不应该有任何问题。@AlexanderHeim我同意,我在评论中声明;)使用
char[][
String[]
如果需要的话。不变性可以防止这个问题。谢谢大家!它很有帮助!:)或者你可以用更简单、更有效的方法来做,只需创建一个二维数组。用你当前的算法循环一下,你应该不会有任何问题。@AlexanderHeim我同意,我在评论中声明;)使用
char[]
String[]
如果需要的话。不变性可以防止出现这种问题。谢谢大家!这很有帮助!:)
OO...OO

OO...OO

OO...OO

OO...OO

OO...OO

OO...OO
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.
    }
}
for(int i = 0; i < newArr.length; ++i){
    newArr[i] = new StringBuffer(s.toString());
}