【问题标题】:Removing elements in ArrayList with certain size删除 ArrayList 中具有特定大小的元素
【发布时间】:2015-12-09 18:58:44
【问题描述】:

所以我目前被困在我的一个程序上。我必须使用 for 循环来删除 ArrayList 中大于 4 的所有元素。我不知道该怎么做。有人帮忙吗?

这是我的代码:

import java.util.ArrayList;
public class P4E
{
    public static void main( String args[] )
        {
            ArrayList<String> universities = new ArrayList<String>();
            universities.add("Princeton");
            universities.add("UCSD");
            universities.add("UCLA");
            universities.add("SDSU");
            universities.add("UCI");
            int size = universities.size();
            System.out.println( "The size of the ArrayList is: " + size);
            System.out.println("");
            System.out.println("Now using a for-each loop");
            System.out.println("");
            for (String a : universities)
                {
                    System.out.println( a );
                }//end for-each
            System.out.println( "" );
            System.out.println( "Now using a for loop" );
            System.out.println( "" );
            for (int i = 0; i < universities.size(); i++)
                {
                    if (universities.get(i) > 4 )
                        {
                           universities.remove(i); 
                        }//end if-statement
                }//end for loop
        }//end main
}

【问题讨论】:

  • 您的意思是要删除 index 大于 4 的元素吗?你的元素本身是Strings;它们无法与4 相比。

标签: java for-loop arraylist size


【解决方案1】:

List 上使用Java 8 removeIf 默认方法:

universities.removeIf(u -> u.length() > 4);

【讨论】:

    【解决方案2】:

    如果您尝试删除大于 4 个字符的元素,这将起作用:

    for (int i = 0; i < universities.size(); i++)
    {
        System.out.println("checking "+universities.get(i));
        if (universities.get(i).length() > 4 )
            {
               universities.remove(i);
               i--;
            }//end if-statement
    }//end for loop
    

    .length() 是必需的,因为您对string 的大小感兴趣,您无法直接将stringint 进行比较。 i--; 确保您不会随着列表大小的变化而跳过元素。

    System.out.println 用于向您显示它正在检查的元素,以便您可以看到您正确地浏览了列表。

    【讨论】:

      【解决方案3】:

      而不是if(universities.get(i) &gt; 4)

      这样做:

      for (int i = size; i >= 0; i--)
      {
          if (i > 4 )
              universities.remove(i);  // Shorten to only 1 line instead of brackets
      }//end for loop
      

      原因

      在这种情况下,您想删除点 i 处的大学,而不是获取大学对象。当您调用universities.get(i) 时,它会返回universities ArrayList 中的对象

      【讨论】:

        【解决方案4】:

        当前代码的问题在于您每次都增加 i,而有时您删除元素会导致向左移动元素的索引。这导致您跳过检查某些元素的事实。示例:

        初始数组:[5,6,7],索引 i = 0。 您删除了索引 0 处的元素 - 数组变为 [6,7],然后增加 i 并变为 1 - 因此要检查的下一个元素的索引为 1,此参考为 7,而不是 6。结果 - 您没有检查6.

        解决方案:

        1) 在universities.remove(i); 之后立即添加i--;

        2) 降序迭代:for (int i = 0; i &lt; universities.size(); i++) -> for (int i = universities.size() - 1; i &gt;= 0; i--)

        3) 使用 java 流:

        universities = universities.stream()
                                   .filter(e -> e > 4)
                                   .collect(Collectors.toList());
        

        【讨论】:

          【解决方案5】:

          您的代码的问题是,即使在 remove() 调用之后,i 仍会前进到下一个值,这意味着您的代码将跳过一些项目。

          这就是发生的事情:假设您要从此列表中删除所有 4 及以上的数字:{9 5 7 4 3}。当i 为零时,您的算法将找到9 并将其删除。现在i1,但你的列表是{5 7 4 3},所以索引0 处的5 将永远不会被再次检查。

          一种解决方案是以相反的顺序迭代:

          for (int i = universities.size() - 1; i >= 0 ; i--) {
              if (universities.get(i).length() > 4 ) {
                  universities.remove(i); 
              }//end if-statement
          }//end for loop
          

          现在i 下降而不是上升,列表是否缩小并不重要。

          【讨论】:

            【解决方案6】:

            您所说的大于 4 究竟是什么意思?如果您的意思是字符串的长度大于 4,那么这就是解决方案。用下面的代码替换第二个 for 循环。

            int i = 0;
            while(i<universities.size()) {
                if (universities.get(i).length() > 4 ) {
                    universities.remove(i); 
                } else {
                    i++;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2011-05-13
              • 2019-02-06
              • 1970-01-01
              • 1970-01-01
              • 2010-10-15
              • 1970-01-01
              • 1970-01-01
              • 2018-04-19
              • 1970-01-01
              相关资源
              最近更新 更多