Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java范围查找最大和最小int之间的差异_Java - Fatal编程技术网

Java范围查找最大和最小int之间的差异

Java范围查找最大和最小int之间的差异,java,Java,我很难准确地找到数组中的最大数和最小数 编写一个方法范围,该范围接受整数数组列表作为参数,并返回列表中包含的值的范围,该范围定义为大于最大和最小元素之差1。例如,如果名为list的变量存储以下值: [18,14,29,12,7,25] rangelist的调用应该返回23,因为这比任何一对值29-7+1=23之间的最大差值多一个。空列表的定义范围为0 到目前为止,我有: public static int range(ArrayList<Integer> list) { in

我很难准确地找到数组中的最大数和最小数

编写一个方法范围,该范围接受整数数组列表作为参数,并返回列表中包含的值的范围,该范围定义为大于最大和最小元素之差1。例如,如果名为list的变量存储以下值:

[18,14,29,12,7,25]

rangelist的调用应该返回23,因为这比任何一对值29-7+1=23之间的最大差值多一个。空列表的定义范围为0

到目前为止,我有:

public static int range(ArrayList<Integer> list)
{
    int min = 0;
    int max = 0;
    int range = 0;
  for (int i: list)
    {
       if (list.size() > 0)
        {
         range = max - min + 1;
        }
    }
      return range;
}

多谢各位

您从不计算循环中的最大值和最小值

提示:在此循环中,找到最大值和最小值。然后计算范围并返回它

int min = 0;
int max = 0;
for (int i: list){
 //find max and min here
}
return max - min + 1;

此任务只需要两行:

Collections.sort(list);
return list.isEmpty() ? 0 : list.get(list.size() - 1) - list.get(0);
使用JavaJDK的API为您完成繁重的工作 重要的是你如何看待问题 只要代码清晰易读,代码越少越好 为什么不使用和


你有不止一种方法来实现这个目标

使用更紧凑但更昂贵的集合,因为它在列表上重复两次,一次查找最大值,一次查找最小值:

public static int range(final ArrayList<Integer> list) {
    if (list.isEmpty()) {
        return 0;
    } else {
        return (Collections.max(list) - Collections.min(list)) + 1;
    }
}
或者使用您自己的算法,如下面的代码,但只使用一个循环查找最小值和最大值:

public static int range(final ArrayList<Integer> list) {
    if (list.isEmpty()) {
        return 0;
    } else {
        int max = list.get(0);
        int min = list.get(0);
        for (final int i : list) {
            if (i > max) {
                max = i;
            } else if (i < min) {
                min = i;
            }
        }
        return (max - min) + 1;
    }
}

你们可以把它分类,然后看一下拳头和最后一件物品

public static int range(List<Integer> input)
{
     if(input == null || input.size() == 0) throw new IllegalArgumentException("");

     if(input.size() == 1) return 0;

     List<Integer> copy = new ArrayList(input);

     Collections.sort(copy);

     int min = copy.get(0);
     int max = copy.get(copy.lenght-1);

     return max - min; 
}
这不是一个完美的解决方案,因为列表可能包含空值

你可以从简单的比较开始

int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;

for(Integer integer : input) {
   if(i == null) continue;

   int i = integer.intValue();

   if(i < min) {
     min = i;
   } 

   if(i > max) {
    max = i;
   } 
}

return max - min;

提示Math.max和Math.min将帮助您计算循环中的最小值和最大值,并在循环后返回差值。为什么子类?只需返回计算+1,我在更少代码范例中被击败:@mad Now这是作弊!如果列表为空,此代码可能引发NoTouchElementException。在调用max和min方法之前必须检查它。当列表包含负数时,此操作将失败。如果列表为空,则此代码可能引发NosTouchElementException。在调用max和min方法之前必须检查它。@LucaMastrostefano是的-这不是一个完整、安全的解决方案,但由于您提出了这一点,我增加了安全性。仍然只有两行:现在是伟大的!但在我看来,排序是对资源的浪费,最好使用最小值和最大值方法。@LucaMastrostefano性能上的差异可以用微秒甚至纳秒来衡量。实际上,这可能不会比max/min慢多少,因为max/min需要遍历列表的两个s-如果列表排序足够,排序将非常快。您如何知道对象是如何比较的?尝试使用非常昂贵的方法对数百万个对象进行排序。你可能会损失几秒钟。你可以使用Math.min和Math.max代替。不,我不能,因为:Math类型中的方法maxint,int不适用于参数数组。使用更紧凑但更昂贵的集合,因为它在列表上迭代了两次,是吗?是的,是的。添加或删除元素时,ArrayList不会计算列表的最大值或最小值。因此,Collections.max在列表中删除一次,Collections.min在列表中删除另一次。
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;

for(Integer integer : input) {
   if(i == null) continue;

   int i = integer.intValue();

   if(i < min) {
     min = i;
   } 

   if(i > max) {
    max = i;
   } 
}

return max - min;
public static int range(ArrayList<Integer> list){
    int min = list.get(0);
    int max = list.get(0);
    for (int i = 0; i < list.size(); i++){
        if (list.get(i) > max)
            max = list.get(i);
        if ((list.get(i) < min))
            min = list.get(i);
    }
    return max-min+1;
}