【问题标题】:Remove N first occurrences of a number in an ArrayList [duplicate]删除 ArrayList 中第一次出现的 N 个数字 [重复]
【发布时间】:2022-01-23 00:12:45
【问题描述】:

我有一个 ArrayList,我必须删除数字 1 的前 2 个实例

public void remove(int num, int element) {

    ArrayList<Integer> arr = [1, 2, 1, 2, 1];
    // ...
}

element 是 myArray 中的数字,num 是我必须删除元素的次数。

所以如果num 为2,element 为1,则ArrayList 将包含[2, 2, 1]

我该怎么做?我尝试了一个 for 循环,但我不知道如何写“多少次”。谢谢

【问题讨论】:

    标签: java arraylist collections


    【解决方案1】:

    首先,可能需要确保输入列表至少包含num 出现的所需元素,也就是说,应该跟踪适当的索引,并且一旦检测到num 元素,删除这些索引处的元素:

    public static void removeNFirst(ArrayList<Integer> list, int num, int element) {
        int[] indexes = IntStream.range(0, list.size())
            .filter(i -> list.get(i) == element)
            .limit(num)
            .toArray();
        
        // make sure at least num elements are found
        if (indexes.length < num) {
            return;
        }
    
        for (int i = indexes.length; i-- > 0; ) {
            list.remove(indexes[i]);
        }
    }
    

    测试:

    ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 1, 2, 1, 3));
    System.out.println("Initial: " + list);
    removeNFirst(list, 3, 1);
    System.out.println("Removed three first 1: " + list);
    removeNFirst(list, 2, 2);
    System.out.println("Removed two first 2: " + list);
    

    输出:

    Initial: [1, 2, 1, 2, 1, 3]
    Removed three first 1: [2, 2, 3]
    Removed two first 2: [3]
    

    【讨论】:

    • 但它不会总是删除两个元素,需要删除的特定类型的元素数量也会作为参数传递给方法
    • @GurkiratSinghGuliani,是的,问题的标题误导了我一点,所以更新后的答案完全删除了 num 匹配元素。
    • 好吧,如果你确定num 总是两个,你可以简单地使用list.remove((Object)element); list.remove((Object)element); 对于任意num,我会将toArray() 替换为reduce((a,b) -&gt; b) 来查找要删除的最后一个元素的索引,后跟list.subList(0, lastToRemove + 1).removeIf(o -&gt; o == element);,因为这样可以避免复制剩余元素num 次。
    【解决方案2】:

    对您的问题的简短回答:

    你可以继续减少数字直到它达到0。如果数字与元素匹配,那么你可以删除它。

    需要思考的问题:

    如果要删除的元素数量多于列表中的元素数量,该怎么办。 例如,对于您的数组,如果元素 1 被删除超过 4 次会怎样。

    示例解决方案:

    我在下面提供的逻辑适用于要删除的元素数量始终小于或等于列表中存在的元素的情况。

    public class Swtich {
        public static void main(String[] args) {
    
            remove(2,1);
        }
    
        public static void remove(int num, int element) {
    
            ArrayList<Integer> arr = new ArrayList<>();
            arr.add(1);
            arr.add(2);
            arr.add(1);
            arr.add(2);
            arr.add(1);
    
            System.out.println(arr);
            int i = 0;
    
            while (num > 0) {
    //          System.out.println(arr);
                if (arr.get(i) == element) {
                    arr.remove(i);
                    num--;
                } else {
                    i++;
                }
            }
    
            System.out.println(arr);
        }
    }
    

    输出如下:

    [1, 2, 1, 2, 1]
    [2, 2, 1]
    

    【讨论】:

    • 所以如果 num 为 2 且 element 为 1,则 ArrayList 将包含 [2, 2, 1] -> 我认为 OP 已指定值 num 和 element,
    • 但是 OP 说结果应该是 [2, 2, 1] ,我错过了 st 吗?
    • @AlexRudenko 是的,谢谢,意识到我的错误
    【解决方案3】:
    public static void remove(ArrayList arr, int num, int element){
        int removeCounter = 0;
        while (removeCounter != num) {
            arr.remove(arr.indexOf(element));
            removeCounter++;
    }
    

    你可以像在我的代码中那样使用计数器...你也应该在方法块之外创建 ArrayList,这样你就可以在 main 方法中打印它。

    【讨论】:

      【解决方案4】:

      iteratorcounter 组合在一起。

      public void remove(int num, int element) {
          ArrayList<Integer> arr = [1, 2, 1, 2, 1];
          Iterator<Integer> arrIterator = arr.iterator();
          int count = 0;
          while(arrIterator.hasNext() && num > count) {
              if (arrIterator.next().equals(element)) {
                  arrIterator.remove();
                  count++;
              }
          }
      }
      

      【讨论】:

      • ArrayList&lt;Integer&gt; arr = [1, 2, 1, 2, 1]; 以前从未见过这种语法,并且在文档中找不到任何提及?
      • 我从他的例子中复制了它。这不太可能真正编译,但如果你想确保询问 OP。
      【解决方案5】:

      调用remove(Object),删除找到的第一个实例,n次:

      Integer numberToRemove = 1; // note: must be Integer
      for (int i = 0; i < n; i++) { 
          arr.remove(numberToRemove);
      }
      

      请注意,List&lt;Integer&gt;, you must remove an Integer, otherwise the remove(int)` 方法将被调用,该方法将删除位置上的元素,而不是按值。

      【讨论】:

      • 但它不会总是第 2 位,对吧?
      • @GurkiratSinghGuliani 我的意思是1,但是是的,它将永远是1,因为这就是OP想要的。
      • Element 是 myArray 中的数字,num 是我必须删除元素的次数。因此,如果 num 为 2 而我的元素为 1,则 ArrayList 将包含 = [2, 2, 1] -> OP 给出了一个示例,不一定会提供相同的值
      • @GurkiratSinghGuliani 很好。请参阅编辑后的答案。
      猜你喜欢
      • 2014-12-14
      • 2022-11-22
      • 2015-12-04
      • 1970-01-01
      • 2018-06-24
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多