有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将arraylist中的特定元素移动到最后一个索引

假设我有这个清单

List<Integer> grades = Arrays.asList(9,8,1,0,7,0,0,3);

我想把所有的零移到最后一个索引。。所以我希望输出类似于:

9,8,1,7,3,0,0,0

我可以用简单的数组来实现这一点,但我仍然不知道如何在ArrayList中实现这一点


共 (4) 个答案

  1. # 1 楼答案

    要实现比使用O(n log(n))sort()解决方案更快的O(n)实现,请使用与阵列相同的方法:

    int j = 0;
    for (Integer value : grades) {
        if (value != 0) {
            grades.set(j++, value);
        }
    }
    while (j < grades.size()) {
        grades.set(j++, 0);
    }
    

    当然,如果不是一个ArrayList,那么使用set(int, ?)可能对性能有害,因此最好使用一个可更新的迭代器,即ListIterator

    ListIterator<Integer> iter = grades.listIterator();
    for (Integer value : grades) {
        if (value != 0) {
            iter.next(); // No need to call hasNext() first
            iter.set(value);
        }
    }
    while (iter.hasNext()) {
        iter.next();
        iter.set(0);
    }
    

    为了进行比较,以下是可比较的阵列解决方案:

    int[] grades = {9,8,1,0,7,0,0,3};
    
    int j = 0;
    for (int i = 0; i < grades.length; i++) {
        if (grades[i] != 0) {
            grades[j++] = grades[i];
        }
    }
    while (j < grades.length) {
        grades[j++] = 0;
    }
    
  2. # 2 楼答案

    您可以使用Comparator.comparing对列表进行相应的排序,将所有0移到最后,而不对剩余的值进行排序

    grades.sort(Comparator.comparing(value -> value == 0 ? 1 /* sort last */ : 0 /* don't sort */));  //[9, 8, 1, 7, 3, 0, 0, 0]
    
  3. # 3 楼答案

    谢谢各位

    我用与使用简单阵列相同的方法实现了这一点:

    
     List<Integer> price = Arrays.asList(9,8,1,0,7,0,0,3);
           
            
            int count = 0;
            
            
            for(int i=0; i<price.size(); i++) {
                if(price.get(i) !=0) {
                    
                    price.set(count++, price.get(i));   
                    
                }
                
            }
                 while(count<price.size()) {
                    price.set(count++, 0);
                 
                    
                 }
                System.out.print(Arrays.toString(price.toArray()));
            }
    
    
  4. # 4 楼答案

    如注释中所述,您可以通过使用Listgetset方法而不是[]操作符来重用数组的相同代码

    另一种“偷偷摸摸”的方法可能是利用排序保持两个相等元素的相对位置这一事实,并使用自定义Comparator对列表进行排序,该自定义Comparator根据一个项是否等于0进行排序-所有的零将移到末尾,所有其他项将保持其相对位置:

    grades.sort(Comparator.comparing(i -> i == 0));