2

是的,这是作业,但我需要一些帮助。我已经能够通过最高数字对其进行排序,但在那之后没有一个数字是正确的。数字列表: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;
        }
    }
4

6 回答 6

3

一种让您只通过列表而不需要排序的方法:

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

将前 5 个元素放入ArrayListinto largest

从第 6 个元素开始,查看 中的每个元素 N ArrayList,如果 N 大于中的任何元素largest,则丢弃当前中的最小数字,largest并用 N 替换。

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

于 2013-10-18T21:01:39.297 回答
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

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

我将留下一个问题供您回答(这很重要):最初应该将数组设置为什么?

于 2013-10-18T21:02:22.817 回答
0

我将如何去做:

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

重复直到完成

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

于 2013-10-18T20:49:58.640 回答
0

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

于 2013-10-18T20:49:15.910 回答
0

假设您的集合已排序,并且您想要最后 5 个元素,请尝试以下操作:

for (int i = sortedNums.size() - 5; i < sortedNums.size(); ++i) {
  System.err.println(sortedNums.get(i));
}
于 2013-10-18T20:49:22.770 回答
0

你只需要两行代码:

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

如果你必须“自己做”,最简单的排序方法是冒泡排序

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

效率不高,但很容易编码。

于 2013-10-18T20:49:27.940 回答