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

リストを1回だけ通過させ、並べ替えを必要としないアプローチ:

5 つの整数の配列を宣言します。int[] largest = new int[5];

の最初の 5 つの要素を にArrayList入れlargestます。

6 番目の要素から始めて、 の各要素 N を見て、 N がのどの要素ArrayListよりも大きい場合は、現在入っている最小の数を破棄して N に置き換えます。largestlargest

重複を除外する必要がある場合は、アルゴリズムを簡単に変更できます (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

最後に、配列には5つの要素があります

1 つ質問を残します (これは重要です): 最初に配列を何に設定する必要がありますか?

于 2013-10-18T21:02:22.817 に答える
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

次の 2 行のコードのみが必要です。

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

「自分でやる」必要がある場合、ソートする最も簡単な方法はバブルソートです。

  • リストを反復処理する
  • 順番が間違っている場合は、隣接する数字を入れ替えます
  • n回繰り返す

効率的ではありませんが、コーディングは非常に簡単です。

于 2013-10-18T20:49:27.940 に答える
0

これを行う方法:

最初の ArrayList のコピーとして、一時的な ArrayList を作成します。最大の各要素が見つかったら、それを一時的な ArrayList から削除し、最大の 5 つの数値に追加します

完了するまで繰り返します

編集* これは要素をソートする必要がなく、結果として効率がかなり悪くなります

于 2013-10-18T20:49:58.640 に答える