使用传统的for循环删除字符串数组中的某些元素

时间:2016-03-06 03:06:16

标签: java arrays

作业说明    编写一个传统的for循环,检查字符串“Meg”的每个元素,如果在数组中找到,删除它,移动剩余的元素,并显示名称数组。

无法围绕这个概念。我理解如何初始化一个数组并在循环外重新分配元素,但无法弄清楚如何在for循环中替换它们。这就是我所拥有的。这是我的第一个编程课,我很挣。如果有经验丰富的人可以彻底解释删除“Meg”的过程,我会比你知道的更感激。

计划:

public class CustomerListerArray{

  public static void main(String[] args){

    String[] customerNames = new String[7];

    customerNames[0] = "Chris";
    customerNames[1] = "Lois";
    customerNames[2] = "Meg";
    customerNames[3] = "Peter";
    customerNames[4] = "Stewie";

    for(String element : customerNames){
      System.out.println(element);
    }
    System.out.println();

    customerNames[6] = customerNames[4];
    customerNames[5] = customerNames[3];
    customerNames[4] = "Brian";
    customerNames[3] = "Meg";

    for(String element : customerNames){
      System.out.println(element);
    }

    System.out.println();
    //******************************************************************
    for(int i = 0; i < customerNames.length; i++) {

      if(customerNames.equals("Meg")){
        customerNames[i] = null;

        for(int j = i; customerNames.equals(null); j++){
          customerNames[i] = customerNames[j + 1] ;
          System.out.println(customerNames[i]);
        }
      }
    }//******************************************************************
  }
}

2 个答案:

答案 0 :(得分:1)

执行此问题的最简单方法是声明另一个大小为customerNames的数组,遍历customerNames,如果customerName为“Meg”,则不执行任何操作,否则将其添加到新阵列。最后,您将拥有一个除“meg”之外的所有名称的数组。在这一个for循环中,您可以计算非“meg”名称。

另一种效率低下的方法是每次找到“meg”时,将所有元素移到一个之后。因此,如果您在i=2处找到“meg”,则从2开始遍历数组customerNames[i]=customerNames[i+1],这将逐个移动所有元素。此方法将起作用,因为您正在替换存储“meg”的索引与之后的元素。

把它想象成一系列的盒子,当你从中间拿出一个盒子时,你想要移动所有其他盒子以摆脱空白区域。或者甚至更好地采用excel数字1-10中的列,如果你清空一个随机单元格,你必须逐个移动每一个以填补空白。 (显然在excel中有一个解决方法,只是一个例子)

我会给你解决方案,但作为一个初学者经历这种痛苦并自己搞清楚,这在我眼中是必不可少的。

答案 1 :(得分:1)

为了解决这个问题,需要了解一些不同的事情。

  1. 在数组中查找值
  2. 从数组中删除值
  3. 将值移到该点之外以填补空白
  4. 查找值

    您已经想出了如何迭代数组。这是这个问题中最困难的部分。在那之后你几乎可以免费获得第1步。

    for (int i = 0; i < array.length; i++) {
        String currentString = array[i];
    }
    

    当您迭代或遍历数组时,您可以使用for循环的索引变量(i在我的示例中访问每个位置的字符串以上)。位置i的字符串为array[i]

    如果您要搜索特定字符串,只需将每个字符串与搜索值进行比较。要比较字符串,请检查string1.equals(string2)

    所以到目前为止我们所拥有的是:

    String searchStr = "FindMe";
    for (int i = 0; i < array.length; i++) {
        if (searchStr.equals(array[i])) {
            System.out.println("Found!");
        }
    }
    

    非常简单。我们遍历数组,找到了我们想要的值,并在找到我们要查找的内容时向控制台打印了一条消息。所以我们就在那里。

    删除值

    因此,我们确定了解决此问题需要采取的另外两个步骤。但事实证明,我们可以同时执行第2步和第3步!让我们考虑为什么这是可能的。第2步要求我们删除一个值。在Java数组中,我们通过用其他东西覆盖它们来删除它们。由于第3步告诉我们将值保留,我们实际上最终会覆盖步骤2中的值!

    如果我们要删除Y

    ,请考虑此数组
    |X|Y|Z|
    

    我们可以先“删除”Y

    |X|_|Z|
    

    然后左移Z

    |X|Z|_|
    

    或者我们可以在一步中将Z向左移动:

    |X|Y|Z| => |X|Z|_|
    

    我们将尝试第二种方法,因为它看起来更简单。所以让我们找到我们正在寻找的字符串,然后,对于它的每一个元素,开始将元素向左移动一个位置。

    int index = 0;
    String searchStr = "FindMe";
    
    for (int i = 0; i < array.length; i++) {
        if (searchStr.equals(array[i])) {
            // Make a note of where we found it, then stop searching
            index = i;
            break;
        }
    }
    
    for (int i = index; i < array.length - 1; i++) {
        // Replace each value with the next value
        array[i] = array[i+1];
    }
    

    现在我们已经通过从搜索字符串开始删除每个值并将其替换为右边的值来有效地移动剩余的值。

    我们仍有一个问题。你会注意到第二个for循环在array.length - 1结束。我们用右边的那个替换了每个值......但是最后一个元素没有任何东西。如果尝试将其替换为array[i+1]处的值,我们会得到ArrayIndexOutOfBoundsException。您无法查看超出数组边缘的值。那么在那种情况下我们该怎么做?实际上非常简单:

    array[array.length - 1] = null;
    

    只需用null覆盖最后一个值,这就是我们在Java中表示“无”的概念。我们已将最后一个值移到左侧,因此我们只需将其替换为null即可完成删除过程。

    我们现在有一个不再包含搜索字符串的数组!

    P.S如果在阵列中找不到字符串怎么办?!

    当然,在处理日益复杂的问题时,我们必须考虑无效的输入数据。如果我将它放到数组的末尾并且从不找到我的字符串会发生什么?简单:没有什么可以删除,所以我们的工作已经完成!我们只是调整代码,因此在第二个if循环周围有一个for语句:

    int index = -1;
    String searchStr = "FindMe";
    
    for (int i = 0; i < array.length; i++) {
        if (searchStr.equals(array[i])) {
            index = i;
            break;
        }
    }
    
    if (index > -1) {
        for (int i = index; i < array.length - 1; i++) {
            array[i] = array[i+1];
        }
    }
    
    array[array.length - 1] = null;