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