【问题标题】:Filer contents of a string array (Java)字符串数组的 Filer 内容 (Java)
【发布时间】:2021-07-02 14:24:58
【问题描述】:

我正在编写一个代码,它接受一个字符串数组并过滤掉包含某个字母的某些内容。例如,对于我拥有的数组,我想过滤掉所有包含字母“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]);
    }
  }
}

【问题讨论】:

  • 我相信你想要的是 charAt() 而不是 indexOf()。

标签: java arrays loops indexing filter


【解决方案1】:

arr[i].indexOf(j, j + 1) 应替换为arr[i].substring(j, j + 1),因为String#indexOf 的返回类型是一个整数,但您希望该字符回到该位置。

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


也就是说,使用String#contains 可以更直接地实现您正在做的事情

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

    for(int i = 0; i < arr.length; i++){
        if (arr[i].contains("b")) {
            arr[i] = "";
        }
    }

    for(int i = 0; i < arr.length; i++){
        System.out.println(arr[i]);
    }
  }
}

【讨论】:

    【解决方案2】:

    您遇到的问题是 String.indexOf 方法返回字符串中另一个字符串出现的位置,如果没有出现,则返回 -1。在您的情况下,您正在查看数组中的每个条目并检查 j 是否出现在字符串中。

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

    【讨论】:

      【解决方案3】:

      这是使用 Java 的 Stream 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));
          }
      }
      

      【讨论】:

      • 我想@jhale1805 你不是在修改现有数组,而是创建一个新数组——
      • @SergeyAfinogenov 您是正确的,OP 要求解决方案“在不创建新数组的情况下工作”,并且该解决方案在技术上确实创建了一个新数组。也就是说,OP 还要求解决方案“从数组中删除 [带有 'b' 的元素]”。 IMO,“从阵列中取出一些东西”意味着将大小调整为更小的容量,这需要创建一个新的阵列。鉴于相互冲突的要求,我选择在我的解决方案中优先考虑后者。作为旁注,您使用 Streams 替换空字符串的解决方案教会了我一些新东西!谢谢!
      【解决方案4】:

      通过使用数组索引流:

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

      或:

       IntStream.rangeClosed(0,arr.length-1)
                .filter(i-> arr[i].contains("b"))
                .forEach(i-> arr[i]="");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-12
        • 2020-03-21
        相关资源
        最近更新 更多