【问题标题】:Java - how to find a letter in a string in ArrayList the duplicate stringJava - 如何在ArrayList中的字符串中查找重复字符串中的字母
【发布时间】:2017-07-27 10:15:38
【问题描述】:

我对某些任务有疑问。我必须找到包含字母“r”的单词并复制这些单词。我试图用 for 循环来做到这一点:

for(int i = 0; i < list.size(); i++){
if(list.get(i).contains("r")){
            list.add(list.get(i));
 }

但它根本不起作用。当我向数组添加新元素时,它会变大吗?那么 list.size 会改变并且循环不会设法到达数组的最后一个元素?重复的单词也应该在原始单词之后,例如输入:

显示 内存 猫

输出:

显示 内存 内存 猫

我真的不知道如何复制它。

这也不起作用:

for(int i = 0; i < list.size(); i++){
if(list.get(i).contains("r")){
            list.add(i+1, list.get(i));
}

【问题讨论】:

  • 为什么不创建一个重复的ArrayList?
  • 嗯,我不知道我可以:D 以为我必须改变现有的。谢谢。

标签: java string arraylist duplicates


【解决方案1】:

为包含字母 r 的元素添加重复项后,您最终将移动到该重复项,并且由于它还包含 r,您将为它添加重复项,然后在访问另一个副本后,您将添加另一个重复项它,等等……无限循环,这样你的循环就不会结束(直到你耗尽内存)。

为避免这种情况,在复制元素后,您需要跳转到该副本之后的下一个元素。您可以通过在

之后额外增加 i 来实现
list.add(i+1, list.get(i));
i++;

list.add(++i, list.get(i));

【讨论】:

  • 天哪,这很容易 :D 非常感谢!
【解决方案2】:

您可以创建原始List 的副本并向其中添加元素。这样你迭代的列表就不会改变大小。

例如:

List<String> list = Arrays.asList("show", "ram", "cat");
List<String> result = new ArrayList<>(list);
list.stream().filter(a -> a.contains("r")).forEach(a -> result.add(a));

【讨论】:

    【解决方案3】:

    根据列表的类型,这可以通过ListIterator 轻松实现,它有一个add 方法,可以在当前元素之后添加一个元素,但不会对其进行迭代。

    List<String> list = new ArrayList<>( Arrays.asList( "show", "ram", "cat" ) );
    
    ListIterator<String> iterator = list.listIterator();
    while ( iterator.hasNext() ) {
        String value = iterator.next();
        if ( value.contains("r") ) {
            iterator.add(value);
        }
    }
    
    System.out.println( list );
    

    由此产生的输出是:

    [显示,公羊,公羊,猫]

    这适用于ArrayListLinkedList,但不适用于直接来自Arrays.asList 的特定List,因为它是不可修改的。

    【讨论】:

      【解决方案4】:

      保持简单,只需使用另一个List&lt;String&gt;

      public static void main(String[] args) {
          List<String> input = Arrays.asList("show", "ram", "cat");
      
          List<String> result = new ArrayList<>();
          for (String s : input) {
              if (s != null && s.contains("r")) {
                  result.add(s);
              }
              result.add(s);
          }
      
          System.out.println(result);
      }
      

      将打印您想要的。希望对您有所帮助!

      【讨论】:

        【解决方案5】:

        您需要找到包含字母 r 的单词,然后将所有找到的单词添加到列表中:

            List<String> list = Arrays.asList("black", "red", "blue");
            List<String> result = list.stream()
                .filter(i->i.contains("r"))
                .collect(Collectors.toList());
        
            list.addAll(result);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-04
          • 2016-07-06
          • 2017-09-25
          • 2017-10-23
          • 2020-02-24
          • 1970-01-01
          • 2011-04-15
          • 1970-01-01
          相关资源
          最近更新 更多