字符串数组的文件服务器内容(Java)

字符串数组的文件服务器内容(Java),java,arrays,loops,indexing,filter,Java,Arrays,Loops,Indexing,Filter,我正在编写一个代码,它采用字符串数组并过滤掉包含特定字母的特定内容。例如,对于我拥有的数组,我希望过滤掉包含字母“b”的所有内容,并将它们从数组中删除,而不创建新数组(从现有数组中删除)。我目前正在使用indexOf方法,它给了我一些问题。它告诉我一个错误,int不能转换成字符串。我不知道这有什么问题 public class Main { public static void main(String[] args) { String [] arr = {"abc"

我正在编写一个代码,它采用字符串数组并过滤掉包含特定字母的特定内容。例如,对于我拥有的数组,我希望过滤掉包含字母“b”的所有内容,并将它们从数组中删除,而不创建新数组(从现有数组中删除)。我目前正在使用indexOf方法,它给了我一些问题。它告诉我一个错误,int不能转换成字符串。我不知道这有什么问题

public class Main {
  public static void main(String[] args) {
    String [] arr = {"abc","bcd", "cad", "aaa"};

    for(int i = 0; i < arr.length; i++){
        for(int j = 0; j < arr[i].length(); j++){
            String index = arr[i].indexOf(j, j + 1);
            if(index == "b"){
                arr[i] = "";
            }
        }
    }

    for(int i = 0; i < arr.length; i++){
        System.out.println(arr[i]);
    }
  }
}
公共类主{
公共静态void main(字符串[]args){
字符串[]arr={“abc”、“bcd”、“cad”、“aaa”};
对于(int i=0;i
arr[i].indexOf(j,j+1)
应替换为
arr[i].substring(j,j+1)
,因为
String#indexOf
的返回类型是一个整数,但您希望字符返回到此位置

if(index==“b”)
if(index.equals(“b”)
生成,因为由于
index
“b”
是两个不同的对象,您可能会得到意外的结果。这就是为什么应该使用
String#equals
的原因


也就是说,通过使用
String#contains

公共类主{
公共静态void main(字符串[]args){
字符串[]arr={“abc”、“bcd”、“cad”、“aaa”};
对于(int i=0;i
您遇到的问题是String.indexOf方法返回字符串中出现另一个字符串的位置,如果没有出现,则返回-1。在您的例子中,您正在查看数组中的每个条目,并检查j是否出现在字符串中


如果要使用indexOf,可以使用arr[i].indexOf(“b”)。这将在字符串中搜索给定的子字符串“b”。然后,您必须检查返回的值是否不等于-1,如果不等于-1,则将该数组位置分配给一个空字符串。

这里有一个使用Java流API的替代解决方案

import java.util.Arrays;

public class Main {
    public static void main(String... args) {
        String [] arr = {"abc","bcd", "cad", "aaa"};
        arr = Arrays.stream(arr)
                    .filter(str -> !str.contains("b"))  // Remove elements containing "b"
                    .toArray(String[]::new);
        System.out.println(Arrays.toString(arr));
    }
}

通过使用数组索引流:

   IntStream.rangeClosed(0,arr.length-1)
         .forEach(i -> {if (arr[i].contains("b")) arr[i]="";});
或:


我相信您需要的是charAt()而不是indexOf()。我假设@jhale1805您不是在修改现有数组,而是在创建新数组–@SergeyAfinogenov您是对的,OP要求解决方案“在不创建新数组的情况下”工作,并且该解决方案在技术上确实创建了新数组。这就是说,OP还要求一个解决方案“从数组中删除(带有“b”的元素)”。在我看来,从阵列中取出一些东西意味着要调整到更小的容量,这需要创建一个新的阵列。考虑到相互冲突的需求,我选择在解决方案中优先考虑后者。作为旁注,您使用Streams替换空字符串的解决方案教会了我一些新的东西!谢谢
 IntStream.rangeClosed(0,arr.length-1)
          .filter(i-> arr[i].contains("b"))
          .forEach(i-> arr[i]="");