Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 第二大数字数组列表_Java_Algorithm_Arraylist - Fatal编程技术网

Java 第二大数字数组列表

Java 第二大数字数组列表,java,algorithm,arraylist,Java,Algorithm,Arraylist,到目前为止,我得到了这个代码: int secondLargest = list.get(0); int largest = list.get(0); for (int i = 0; i < list.size(); i++) { if(list.get(i) > largest) { secondLargest = largest; largest = list.get(i); if(list.get(i) >

到目前为止,我得到了这个代码:

int secondLargest = list.get(0);
int largest = list.get(0);
for (int i = 0; i < list.size(); i++)
{
    if(list.get(i) > largest)
    {
        secondLargest = largest;
        largest = list.get(i);

        if(list.get(i) > secondLargest && list.get(i) != largest)
        {
            secondLargest = list.get(i);
        }
    }
}

System.out.print("Second biggest number ");
return secondLargest;       

第二高的数字的“搜索”在2处停止,因为10是最高的数字。如何解决此问题?

使用
数组。排序(数组)并获取第二个元素。

使用两个for循环。第一个应该找到最大的数字,并存储其索引位置。第二个应该找到与先前找到的数字不在同一索引位置的最大数字。(这将确保您不会错过第二大数字与最大数字相同的情况。)

如果您认为合适,请使用
array.sort(array)并按照ɐuıɥɔɯ的建议获取第二个元素

将第二个
if条件
置于第一个if条件之外

因为
第二大
小于
最大
,所以您永远不会在检查最大值的
if
块中找到它

int secondLargest = (int) list.get(0);
int largest = list.get(0);
for (int i = 1; i < list.size(); i++) {
  if(list.get(i) > largest) {
    secondLargest = largest;
    largest = list.get(i);
  }
  if(list.get(i) > secondLargest && list.get(i) != largest) {
    secondLargest = list.get(i);
  }
}
System.out.print("Second biggest number ");
return secondLargest;
intsecondmaxist=(int)list.get(0);
int最大=list.get(0);
对于(int i=1;i最大值){
第二大=最大;
最大=列表。获取(i);
}
if(list.get(i)>第二大&&list.get(i)!=最大){
第二大=list.get(i);
}
}
系统输出打印(“第二大数字”);
回报率第二大;

在循环的第一个
if语句中,检查
第二大的
而不是
最大的
。下面的内容会让你走

    int secondLargest = list.get(0);
    int largest = list.get(0);
    for (int i = 0; i < list.size(); i++)
    {
        if(list.get(i) > secondLargest)
        {
            if(list.get(i) > largest ) {
                secondLargest = largest;
                largest = list.get(i);
            } else {
                secondLargest = list.get(i);
            }

        }
    }
int secondmaxist=list.get(0);
int最大=list.get(0);
对于(int i=0;i第二大)
{
if(list.get(i)>最大值){
第二大=最大;
最大=列表。获取(i);
}否则{
第二大=list.get(i);
}
}
}

您可以首先使用Collections.max()函数在ArrayList中找到max number,一旦找到max元素,就可以找到该元素的索引并将其从数组中删除。再次使用Collections.max()查找数组中的第二大数字。代码如下

ArrayList<Integer> al = new ArrayList<Integer>();
al.add(1);
al.add(2);
al.add(3);
al.add(4);
System.out.println(al);

int j = Collections.max(al);

System.out.println("Max in the array is " + j);
al.remove(al.indexOf(j));
int max2 = Collections.max(al);
System.out.println(max2);
ArrayList al=new ArrayList();
al.添加(1);
al.添加(2);
al.添加(3);
al.添加(4);
系统输出打印项次(al);
int j=集合的最大值(al);
System.out.println(“数组中的最大值为”+j);
al.remove(al.indexOf(j));
int max2=Collections.max(al);
System.out.println(max2);

如果需要更多的细节,请告诉我。

我认为最简单的方法是对数组进行排序并获取第二个元素(当然,这取决于顺序,所以我假设它是按降序排序的)。此外,如果可以利用集合框架,则可以使用
SortedSet
。对于大型数组来说,这是一种昂贵的方法。排序是
O(n.log(n))
,循环是
O(n)
,因此最好只是循环。同意,但没有人询问渐进复杂性@Keith你不应该因为OP没有指定最坏的解决方案就给出最坏的解决方案complexity@Keith嗯,是的,也许在生产代码中,你会决定将其用于一个小数组。。。或者,您可以在一个util类中编写一个带有一些单元测试的快速选择,这样您就有了一个多用途的方法。就复杂性而言,这是最糟糕的解决方案,如果你要在简单性上做权衡,你的答案至少应该提到它。无论如何请注意,如果第二大数字与最大数字相同,则会失败,假设任务将测试此边缘情况(仔细阅读要求)。@mk。您的意思是当列表包含两个最大值时?我不认为OP会这么做。因为这个逻辑不会出现在图片中,否则
list.get(i)!=最大值
-1:当列表按降序排序,并且没有两个项目具有相同的值(只有一个最大值)时,此操作失败。get(0)是列表和列表中最大的项目。get(1)是第二大数字,但此代码打印“第二大数字”和list.get(0)的值,当它应该打印list.get(1)的值时,即使这样做,也不需要两个循环。您可以在单循环中实现。为什么要增加复杂性?@YoungHobbit实际上降低了复杂性。对于新手(像OP),理解“找到最大的,最大的不是那个”比在循环中做检查要容易得多。它仍然是O(n),如果这就是你所说的复杂性:)
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(1);
al.add(2);
al.add(3);
al.add(4);
System.out.println(al);

int j = Collections.max(al);

System.out.println("Max in the array is " + j);
al.remove(al.indexOf(j));
int max2 = Collections.max(al);
System.out.println(max2);