【问题标题】:How to detect if an element is the last element in an array?如何检测一个元素是否是数组中的最后一个元素?
【发布时间】:2019-04-08 07:49:18
【问题描述】:

下面的代码根据位置拆分一个String,然后把它放到一个ArrayList中。

例如,如果字符串是"Who Framed Roger Rabbit?",那么fragmentMessage 将在每8 个字符处拆分消息。

因此 ArrayList 将如下所示:[Who Fram, ed Roger, Rabbit?]

ArrayList的元素如下:

  1. ArrayList 元素 0:Who Fram
  2. ArrayList 元素 1:ed Roger
  3. ArrayList 元素 2:Rabbit?

然后我在 main 方法中有一个 for-each 循环,它遍历 ArrayList。

如何检测迭代时是否到达数组的最后一个元素?

例如,“如果这是数组的最后一个元素,则打印“LAST ELEMENT”。

import java.util.ArrayList;
import java.util.List;

public class LastElement {

public static void main(String[] args) {

    String message = "Who Framed Roger Rabbit?";
    for (String fragment : fragmentMessage(message)) {
        /*
         * If "fragment" is the last element of the array, then do something
         */
    }
}

private static List<String> fragmentMessage(String message) {
    List<String> fragmentedMessage = new ArrayList<>();

    for (int i = 0; i < message.length(); i = i + 8) {
        fragmentedMessage.add(message.substring(i, i + 8));
        System.out.println(fragmentedMessage);
    }

    return fragmentedMessage;
}
}

【问题讨论】:

  • 你可以使用Iterator,而不是for循环,它有一个hasNext()方法。
  • 或者传统的for循环,它使用一个索引。
  • 可能有更好的方法,这取决于您实际想要实现的目标。但你没有说...

标签: java arrays loops arraylist foreach


【解决方案1】:

没有直接的方法可以知道您在 foreach 循环中是否有 List 的最后一个条目。

最简单的方法是使用索引循环。

类似的东西:

    List<String> fragmentMessage = fragmentMessage(message);
    for (int i = 0; i < fragmentMessage.size(); i++) {
        String fragment = fragmentMessage.get(i);
        /*
         * If "fragment" is the last element of the array, then do something
         */
        if (i == fragmentMessage.size()-1) {

        }
    }

另一个选项是Iterator

    for (Iterator<String> iterator = fragmentMessage(message).iterator();
        iterator.hasNext();) {
        String fragment = iterator.next();
        if (!iterator.hasNext()) {

        }
    }

【讨论】:

    【解决方案2】:

    你有几个选择。

    使用迭代器:

        String message = "Who Framed Roger Rabbit?";
        List<String> fragments = fragmentMessage(message);
    
        Iterator<String> iterator = fragments.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
    
            if (!iterator.hasNext()) {
                System.out.println("All done!");
            }
        }
    

    检查 for/each 循环中的索引:

        for (String str :
                fragments) {
    
            System.out.println(str);
    
            // If this item is the last in the list
            if (fragments.indexOf(str) == fragments.size() - 1) {
                System.out.println("All done!");
            }
        }
    

    使用这种方法,如果您在列表中使用字符串,请注意如果有重复,这将不是很准确。

    用标准for循环跟踪索引:

        for (int i = 0; i < fragments.size(); i++) {
            System.out.println(fragments.get(i));
    
            if (i == fragments.size() - 1) {
                System.out.println("All done!");
            }
        }
    

    【讨论】:

      【解决方案3】:

      我的最终解决方案如下所示。它基于 @k5_ 的回答,并归功于他/她/其他人。

      我使用 if-else 语句定位最后一个元素。

          List<String> fragmentMessage = fragmentMessage(message);
          for (int i = 0; i < fragmentMessage.size(); i++) {
              String fragment = fragmentMessage.get(i);
              if (message.isEmpty()) { // Only if message == "".
                  System.out.println(createFrame(message));
              } else if (i == fragmentMessage.size() - 1) { // Last element of the array.
                  System.out.println(createLastFrame(fragment));
              } else {
                  System.out.println(createFrame(fragment)); // Only if message is not the last message.
              }
          }
      

      【讨论】:

      • 你考虑过最后一个元素也是空的情况吗?
      • @k5_ 我看不到代码中最后一个元素可以为空的任何方式。有什么方法可以私下给你发我的课吗?
      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2016-02-12
      • 2014-06-19
      相关资源
      最近更新 更多