如何在ArrayList <integer>中找到第一个偶数整数?

时间:2016-02-10 17:39:19

标签: java arraylist

在这个方法中,我试图找到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;
}

13 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

indexOf返回索引中找到的值,而不是索引中的值,您可以使用get检索该值,甚至更好,使用增强型{ {1}}循环语法:

for

顺便说一句,请注意,Java 8的流式语法可以帮助您更优雅地完成此任务

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

答案 2 :(得分:1)

您使用索引计算的值不是。这样做:

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);
    }
}

答案 3 :(得分:1)

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;
}

答案 4 :(得分:1)

该方法写错了。而不是indexOf你应该使用get(i)。 IE浏览器。 for循环应如下所示:

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

答案 5 :(得分:1)

您可以使用高级for循环:

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

答案 6 :(得分:1)

您可能会发现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 :(得分:0)

def get_args(): parser = argparse.ArgumentParser(description='Help Desk Calendar Tool') parser.add_argument('-m','--mode', type=str, required=True , metavar='<add|del|list|delID>', choices=['add', 'del' , 'list', 'delID']) parser.add_argument('-s', '--start', type=str, required=False, metavar='<Start date in the following format - YYYY-MM-DD>') parser.add_argument('-e','--end', type=str, required=False, metavar='<End date in the following format - YYYY-MM-DD>') parser.add_argument('-d','--delete', type=str, required=False, metavar='<Event ID Here>') args = parser.parse_args() if args.mode in ['add','del','list']: if args.start is None or args.end is None: parser.error('Options add, del and list all require the start (-s) and end (-e) date to be set') if args.mode == 'delID': if args.start is not None or args.end is not None: parser.error('The option delID can ONLY except the event ID, no other options can be entered') if args.mode == 'delID': if args.delete is None: parser.error('The delete (-d) option is required when delID mode is selected') start = args.start end = args.end mode = args.mode event = args.delete return start,end,mode,event 条件内部返回布尔值。很可能不是你所期望的。

您的代码应如下所示:

list.indexOf((i) % 2 == 0);

答案 8 :(得分:0)

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);

答案 9 :(得分:0)

(i) % 2 == 0

这将返回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.get(i);
              break;
         }

    }

    return  firstEven;
}

答案 10 :(得分:0)

尝试一下......

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

答案 11 :(得分:0)

您可以使用它。...

library(data.table)
nm1 <- grep("Farm", names(df1), value = TRUE)
setDT(df2)[df1, (nm1) := .SD * mget(paste0("i.", names(.SD))), 
           on = .(Year), .SDcols = nm1]
df2
#   Year Month Farm1 Farm2 Farm3
#1: 2015   Jan  1000  2000  4500
#2: 2015   Feb  1000  4000  1500
#3: 2016   Jan  1000  4000  2000
#4: 2016   Feb  1000  2000  2000

答案 12 :(得分:0)

具有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 );