删除<string> ArrayList-Java的元素

时间:2018-11-29 01:59:08

标签: java arraylist

对于Java作业,我们被分配来初始化包含字典单词的字符串的ArrayList。如果单词不是我们生成的长度,则将它们从ArrayList中删除。以下代码不起作用。

public static int randLength() {
        int range=(RAND_MAX-RAND_MIN)+1;
        int randomNum=(int)(Math.random()*range)+RAND_MIN;
        return randomNum;
    }

此功能正常工作。

int randomLength=randLength();
      System.out.println(randomLength);
      for(int i=0;i<dictionaryList.size()-1;i++) {
          if(dictionaryList.get(i).length()!=randomLength) {
              System.out.println("The lucky word is " + dictionaryList.get(i));
              dictionaryList.remove(i);
          }
      }

但是,事实并非如此。使用单词的文本文件初始化dictionaryList。我的是 “苹果” “啤酒” “查理” “小狗” “象” “愤怒” 在某些情况下,上面的代码确实删除了不是randomLength值的单词。但是,它并不能全部删除。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

从ArrayList中删除一项时,您将跳过列表中的下一项,而不检查是否应删除它。

例如,如果您列出的是“苹果”,“啤酒”,“查理”,“狗”,“原子”,“大象”,并且您应删除的单词长度的随机数为4(啤酒,狗和原子都应删除),“原子”将不会删除。当for循环运行时,其运行方式如下:

i:0,单词:“ apples”,未删除

i:1,单词:“啤酒”,已删除

i:2,单词:“狗”,已删除

i:3,单词:“ elephant”,未删除。

如果删除了一个元素,则必须将i减1,以便检查所有元素。您可以将i--放在dictionaryList.remove(i)之后的行中

之所以发生这种情况,是因为当从ArrayList中删除一个元素时,其后的所有元素都向下移动以填充空间,这与Array不同。

另外,您的for循环应使用i<dictionaryList.size()而不是i<dictionaryList.size()-1来检查最后一个元素。

您还可以使用Iterator遍历ArrayList,但是如果您还没有教过它,则可能不想使用它。

答案 1 :(得分:0)

最好使用迭代器删除元素,以避免并发修改异常。

long

答案 2 :(得分:0)

Java Collection类是快速失败的,这意味着如果在使用迭代器遍历某些线程时更改Collection,则iterator.next()将抛出ConcurrentModificationException。

ie:通常不允许一个线程修改Collection,而另一个线程对其进行迭代

在多线程环境中避免ConcurrentModificationException

  1. 您可以将列表转换为数组,然后在数组上进行迭代。 此方法适用于中小型列表,但如果 列表很大,那么会严重影响性能。
  2. 您可以在迭代时锁定列表,方法是将其放入 同步块。不建议使用此方法,因为它会 停止多线程的好处。
  3. 如果您使用的是JDK1.5或更高版本,则可以使用ConcurrentHashMap 和CopyOnWriteArrayListclasses。这是推荐的方法 避免并发修改异常

请考虑以下示例,该示例很快就会失败

enter image description here

使用ConcurrentHashMap:

enter image description here