通过ArrayList迭代获得5个最大数字

时间:2013-10-18 20:43:15

标签: java

是的,这是作业,但我需要一些帮助。我已经能够通过最高数字进行排序,但之后没有数字是正确的。数字列表:http://pastebin.com/Ss1WFGv1 现在,我们正在学习阵列,所以这只是试图用炮弹射击吗?

    package hw2;

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.util.ArrayList;

    public class HW2 {

        public static ArrayList<Integer> nums1 = new ArrayList<Integer>();
        public static int size = 0;

        public static void main(String[] args) throws Exception {
            ArrayList<Integer> sortedNums = new ArrayList<Integer>();


            readFile();
            System.out.println("Name: Jay Bhagat" + "\n" + "Email: xxxxxx");
            size = nums1.size();

            for(int l = 0; l<=10;l++){
            nums1.set(sortThis(nums1, l), 90009);
            System.out.println("\n\n");
            }


    //        for (int k = 0; k <= size - 1; k++) {
    //            System.out.println("Number " + (k + 1) + sortedNums.get(k));
    //
    //        }


        }

        public static void readFile() throws Exception {
            BufferedReader reader = new BufferedReader(new FileReader("L:\\numbers.txt"));

            while (reader.readLine() != null) {
                nums1.add(Integer.parseInt((reader.readLine())));
            }

            reader.close();


        }

        public static int sortThis(ArrayList<Integer> current, int offset) {
            int j = 0;
            int tempNum = 0;
            int curNum = 0;
            int finalIndex = 0;
            int prevIndex = 0;
            int curIndex = 0;

            for (j = 0; j < size-offset; j++) {
                curIndex = j;
                nums1.trimToSize();
                curNum = current.get(j);
                //Thread.sleep(1000);
                if(curNum!=90009){
                if (curNum > tempNum) {
                    tempNum = curNum;
                    System.out.println(tempNum);
                    prevIndex = j;
                    finalIndex = prevIndex;
                }
                if (curNum < tempNum) {
                    finalIndex = prevIndex;
                }
                }    



            }
            return finalIndex;
        }
    }

6 个答案:

答案 0 :(得分:3)

一种方法,只需一次通过列表,不需要排序:

声明一个包含5个整数的数组:int[] largest = new int[5];

ArrayList中的前5个元素放入largest

从第6个元素开始,查看ArrayList中的每个元素N,如果N大于largest中的任何元素,则抛出当前最小的数字在largest中,将其替换为N。

如果您需要排除重复项,则可以轻松修改算法(只需跳过已在ArrayList中的任何largest元素。

答案 1 :(得分:0)

为什么不使用Collections.sort(列表列表)或Arrays.Sort(arr)。这将节省大量的精力。或者它是你的任务的一部分?

答案 2 :(得分:0)

假设您的收藏品已经排序,并且您想要最后5个元素,请尝试这样做:

for (int i = sortedNums.size() - 5; i < sortedNums.size(); ++i) {
  System.err.println(sortedNums.get(i));
}

答案 3 :(得分:0)

您只需要两行代码:

Collections.sort(nums1);
List<Integer> high5 = nums1.subList(nums1.size() - 5, nums1.size());

如果您必须“自己动手”,最简单的排序方式是bubble sort

  • 遍历列表
  • 如果订单顺序错误,则交换相邻的数字
  • 重复n次

效率不高但很容易编码。

答案 4 :(得分:0)

我将如何做到这一点:

创建一个临时ArrayList,作为初始ArrayList的副本。 找到每个最大元素后,将其从临时ArrayList中删除,并将其添加到5个最大的数字

重复直到完成

编辑*这不需要对元素进行排序,因此效率相当低

答案 5 :(得分:0)

我认为你没有自由使用sort等等,考虑到这是一个功课。所以这里是您可以尝试实现的算法概述

 create an array of five integers (we will keep this sorted)
 for each element in the list
   find the index of the element in the array that it is greater than
   if no such element exists in the array (i.e. it is smaller than all elements in the array)
     continue on to the next element in the list
   else
     push all elements in the array to one index below, letting them fall off the 
     edge if need be (e.g. if the number in list is 42 and the array has 
     45 and 40 at index 3 and 2 respectively then 
     move arr[1] to arr[0], and arr[2] (40) to arr[1] and set arr[2] = 42)
   end if
 end for

最后,数组将包含五个元素

我将留下一个问题让你回答(重要的是):你最初应该将数组设置为什么?