【问题标题】:How to store and read scanner input in an array/arraylist?如何在数组/数组列表中存储和读取扫描仪输入?
【发布时间】:2020-11-20 10:01:28
【问题描述】:

我正在尝试编写一个程序来打印出存储在ArrayList 中的第三大数字。我尝试对其进行排序,然后将列表反转为并使用 get() 方法来获取第三高数字的索引。但它没有考虑前 3 个插槽中是否存在重复。

如何遍历arraylist得到第三个highs值?

到目前为止我做了什么。

import java.util.*;

public class third {
    public static void main(String[] args) {
       

        ArrayList<Integer> numbers = new ArrayList<>(); //creating an array object
        Scanner scan = new Scanner(System.in); // scanner to read user input

        
        // print statement to get input
        System.out.print("Enter any amount of numbers: "); 
        int i = 0;
        while (scan.hasNextInt()) {// while there is an hasnext has an int                
            numbers.add(scan.nextInt()); //adding input(numbers) to an arraylist
            i++; //increment by 1                     
        } 
        scan.close(); // close the scanner if the user doesnt enter a number.
        
        System.out.println("you entered: " + numbers);
        System.out.println("The largest number you entered is: " + Collections.max(numbers));//print largest number
        System.out.println("The smallest number you entered is: " + Collections.min(numbers));//print smallest number

        Collections.sort(numbers); //sorting the numbers from lowest to highest
        System.out.println("Sorted: " + numbers); //print sorted numbers

        Collections.reverse(numbers); //reverse the order to use to get the third highest value
        System.out.println("Highest to lowest: " + numbers);
        System.out.println("Third highest number is:" + numbers.get(2));//get the third index of the sorted ArrayList       
        }
}

【问题讨论】:

  • 使用Set 代替ArrayList?
  • 循环 3 次会产生比你写的更简单有效的方法。

标签: java loops arraylist


【解决方案1】:

最后需要一个循环来丢弃重复项并找到准确的第三大数字。正如我所做的那样。

import java.util.*;

public class third {
public static void main(String[] args) {
   

    ArrayList<Integer> numbers = new ArrayList<>(); //creating an array object
    Scanner scan = new Scanner(System.in); // scanner to read user input

    
    // print statement to get input
    System.out.print("Enter any amount of numbers: "); 
    int i = 0;
    while (scan.hasNextInt()) {// while there is an hasnext has an int                
        numbers.add(scan.nextInt()); //adding input(numbers) to an arraylist
        i++; //increment by 1                     
    } 
    scan.close(); // close the scanner if the user doesnt enter a number.
    
    System.out.println("you entered: " + numbers);
    System.out.println("The largest number you entered is: " + Collections.max(numbers));//print largest number
    System.out.println("The smallest number you entered is: " + Collections.min(numbers));//print smallest number

    Collections.sort(numbers); //sorting the numbers from lowest to highest
    System.out.println("Sorted: " + numbers); //print sorted numbers

    Collections.reverse(numbers); //reverse the order to use to get the third 
    highest value
    System.out.println("Highest to lowest: " + numbers);
    int counter=0; // To find distinct number 
    for(int i=numbers.size()-1 ; i>=0 ; i--){ // Another loop to by pass 
    //duplicates
    if(numbers.get(i)!=numbers.get(i-1)){
    counter++;
    }
    if(counter==2){      // third highest
      System.out.println("Third highest number is:" + numbers.get(i));//get
    //third index of the sorted ArrayList 
    break;
    }
         
    }
    }

【讨论】:

  • 这很好用,谢谢。但我想知道这个 if 循环到底在做什么。 if(numbers.get(x)!=numbers.get(x-1)){ counter++;
  • 它只是在排序和反转后检查是否存在重复项。如果没有重复,它将增加此计数器。一旦这个计数器的值变为 2,就意味着我们已经达到了第三高的数字。
【解决方案2】:

将arraylist 值传递给hashmap。或者将值存储在哈希图中。 Hashmap 包含无重复项。之后反转集合并像你一样做。

【讨论】:

    【解决方案3】:

    为了找到第三大元素,只需从您的数字列表中创建一个SortedSet。如果该集合至少包含三个元素,那么倒数第三个元素就是您想要的。为了获得倒数第三个元素,请将SortedSet 转换为数组。请参见下面的代码。请注意,SortedSet 是由类TreeSet 实现的接口。

    SortedSet<Integer> ss = new TreeSet<>(numbers);
    if (ss.size() > 2) {
        System.out.println("Third highest number is:" + ss.toArray(new Integer[0])[ss.size() - 3]);//get the third index of the sorted ArrayList
    }
    

    【讨论】:

      【解决方案4】:

      您使用 SortedSet 对重复项进行排序和删除,因此您可以使用(草稿,不检查)而不是 Collections.sort(numbers);

       SortedSet<Integer> numbersSet = new TreeSet<>(numbers );
       numbers = new ArrayList<>(numbersSet);
       Collections.reverse(numbers);        
      
       Collections.reverse(numbers); //reverse the order to use to get the third highest value
       System.out.println("Highest to lowest: " + numbers);
       System.out.println("Third highest number is:" + numbers.length() > 2? numbers.get(2): "not found");//get the third index of the sorted ArrayList       
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        相关资源
        最近更新 更多