【问题标题】:How to find a first even integer in ArrayList<Integer>?如何在 ArrayList<Integer> 中找到第一个偶数?
【发布时间】:2016-02-10 17:39:18
【问题描述】:

在这种方法中,我试图在ArrayList 中找到第一个偶数整数(以供进一步使用)。

但是,当我调用该方法时,我得到 -1。据我所知,这意味着列表中没有整数(但实际上有)。

代码如下:

public static int rangeBetweenEvens(ArrayList<Integer> list) {

    int firstEven = 0;

    for (int i = 0; i < list.size(); i++)
    {
         firstEven = list.indexOf((i) % 2 == 0);

    }

    return  firstEven;
}

【问题讨论】:

  • 需要返回索引还是值?
  • 你的问题能更明确一点吗

标签: java arraylist


【解决方案1】:

您正在尝试查找(i) % 2 == 0 的第一个匹配项,但是,这并不是您认为的那样。这个表达式被评估为一个布尔表达式——如果i 是偶数,则true 和如果奇数则false。在第一次迭代中,i 为 0(偶数),但在列表中找不到 true,因为那里存在整数,所以您返回的结果是 indexOf -- -1

在这里使用indexOf 是一个错误,因为它会在列表中搜索特定值。相反,使用get(i) 检索当前值,并测试它是否是偶数。如果是,则返回当前索引,否则继续搜索。如果没有找到返回-1

【讨论】:

    【解决方案2】:

    indexOf 返回找到值的 index,而不是索引中的值,您可以使用 get 检索它,或者更好的是,使用增强的 for 循环语法:

    public static Integer firstEven(List<Integer> list) {
        for (Integer curr : list) {
             if (curr % 2 == 0) {
                 return curr;
             }
        }
        return null;
    }
    

    顺便提一下,Java 8 的流式语法可以帮助您更优雅地做到这一点

    public static Integer firstEven(List<Integer> list) {
        return list.stream().filter(i -> i % 2 == 0).findFirst().orElse(null);
    }
    

    【讨论】:

      【解决方案3】:

      您正在使用索引而不是值进行计算。这样做:

      for (int i = 0; i < list.size(); i++){
          if(list.get(i) %2 == 0){
               return list.get(i);
          }
      }
      

      【讨论】:

        【解决方案4】:

        方法写错了。你应该使用 get(i) 而不是 indexOf。 IE。 for 循环应该是这样的:

        for (int i = 0; i < list.size(); i++)
        {
             if(list.get(i) % 2 == 0)
                return i;
        }
        

        【讨论】:

        • 如果列表中没有整数,应该返回什么代码?
        • 我想如果作者想保留原始合同,方法末尾应该有一个“return -1”。
        【解决方案5】:

        indexOf(Object o) 接受一个元素并尝试在您的集合中找到它的索引,因此您无法在其中找到条件,因为它会在您的列表中搜索不存在的 true|false

        当你得到索引时,你可以检查和中断循环:

        public static int rangeBetweenEvens(ArrayList<Integer> list) {
        
                int firstEven = 0;
        
                for (int i = 0; i < list.size(); i++)
                {
                        if(list.get(i) % 2 == 0) {
                                firstEven = list.indexOf(i);
                        }
        
                        break;
        
                }
        
                return firstEven;
        }
        

        【讨论】:

          【解决方案6】:

          您可能会发现this post 中的示例很有用。基于此,要找到第一个偶数的索引(如果没有找到则返回 -1),您可以:

              List<Integer> list = Arrays.asList(11, 10, 1, 42, 5, 11, 7);
              int firstEven = IntStream.range(0, list.size())
                      .filter(i -> (list.get(i) % 2 == 0))
                      .findFirst()
                      .orElse(-1);
          
              System.out.printf("first even at %d", firstEven);
          

          【讨论】:

            【解决方案7】:

            您可以使用高级 for 循环:

            for(int i : list){
            if(i%2==0)
            return i;
            }
            

            【讨论】:

              【解决方案8】:

              Java -8 的实现方式(我说开始使用 Java -8 :P)。

              List<Integer> l = Arrays.asList(1,3,4,5,2);
              Optional<Integer> oi = l.stream().filter(i -> i%2==0).findFirst();
              if (oi.isPresent())
              System.out.println(oi.get());
              

              或者像克里斯说的那样,使用:

              l.stream().filter(i -> i%2==0).findFirst().ifPresent(System.out::println);
              

              【讨论】:

              • 或者,.findFirst().ifPresent(System.out::println)(或者你想调用的任何方法)。
              • @chris - 编辑了答案.. Donno 我怎么错过它:(。谢谢
              【解决方案9】:

              list.indexOf((i) % 2 == 0); 内部条件返回布尔值。这很可能不是您所期望的。

              您的代码应如下所示:

              firstEven = -1;
              lastEven = 0;
              for (int i = 0; i < list.size(); i++) {
                  if ( list.get(i) %2 == 0) {
                      if (firstEven == -1)  firstEven = list.get(i);
                      lastEven = list.get(i);
                  }
              }
              

              【讨论】:

              • 感谢您的回答。然而,问题是在同样的方法中,我必须找到最后一个偶数的索引。您对此有何建议?
              【解决方案10】:
              (i) % 2 == 0
              

              这将返回真或假。并且没有真假作为索引。 试试这个:

              public static int rangeBetweenEvens(ArrayList<Integer> list) {
              
                      int firstEven = 0;
              
                      for (int i = 0; i < list.size(); i++)
                      {
                       if (list.get(i) % 2 == 0) {
                            firstEven = list.get(i);
                            break;
                       }
              
                  }
              
                  return  firstEven;
              }
              

              【讨论】:

                【解决方案11】:

                试试这个...

                for (int i : list)
                {
                     if(i % 2 == 0)
                        return i;
                }
                

                【讨论】:

                  【解决方案12】:

                  你可以使用这个....

                  import  java.util.Arrays;
                  import java.util.Scanner;
                  
                  public class FirstEvenNumber {
                  
                      public static void main(String[] args) {
                          Scanner sc = new Scanner(System.in);
                          String numbers;
                          System.out.println("Enter numbers separated by coma without spaces:");
                          numbers = sc.nextLine();
                          String[] splited = numbers.split(",");
                          sc.close();
                          int [] array = Arrays.asList(splited).stream().mapToInt(Integer::parseInt).toArray();
                          outerloop:
                          for (int num : array){
                              if (num%2 == 0){
                                  System.out.println(num);
                                  break outerloop;
                              }
                          }
                      }
                  }
                  

                  【讨论】:

                  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
                  【解决方案13】:

                  使用 lambda 函数避免 % 模运算符

                  Function<List<Integer>, Integer> firstEven = ints -> {
                    Integer rslt;
                    ListIterator<Integer> it = ints.listIterator();
                    while( it.hasNext() )
                      if( ((rslt = it.next()) & 1) == 0 )
                        return( rslt );
                    return( null );
                  };
                  

                  firstEven.apply( list );

                  【讨论】:

                    猜你喜欢
                    • 2016-01-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-05-06
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-10-11
                    • 1970-01-01
                    相关资源
                    最近更新 更多