亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對單詞列表實現合并排序 - 原始單詞附加回列表?

對單詞列表實現合并排序 - 原始單詞附加回列表?

千巷貓影 2024-01-28 16:55:07
我正在嘗試對 size 的字符串列表實現合并排序算法N,并且我已設法對其進行排序,但由于某種原因,原始值被添加到排序列表的末尾。我對實現排序算法還很陌生(閱讀:非常新),所以如果有人讓我知道我是否錯過了什么,我真的很感激。    public static void mergeSortWords(int n, List<String> words) {        if (n < 2) {            return;        }        int mid = n / 2; // Getting the mid-point of the array        List<String> l = new ArrayList<String>(mid); // Left side of array        List<String> r = new ArrayList<String>(n-mid); // Right side of array        for (int i = 0; i < mid; i++) {            l.add(i, words.get(i));        }        for (int j = mid; j < n; j++) {            r.add(j - mid, words.get(j));        }        mergeSortWords(mid, l); // recursively sort the left side        mergeSortWords(n-mid, r); // recursively sort the right side        mergeWords(n, words, l, r, mid, n-mid); // merge the sorted arrays back together    }    public static void mergeWords(int n, List<String> words, List<String> l, List<String> r, int left, int right) {        if (words.size() > n) {            return;        }        int i = 0, j = 0, k = 0;        while (i < left && j < right) {            if (l.get(i).compareToIgnoreCase(r.get(j)) < 0) { // comparing the strings alphabetically                words.add(k++, l.get(i++));            }            else {                words.add(k++, r.get(j++));            }        }        while (i < left) {            words.add(k++, l.get(i++));        }        while (j < right) {            words.add(k++, r.get(j++));        }    }我像這樣進行單元測試:    @Test    public void mergeSortWordsTest() {        List<String> actual = new ArrayList<String>();        List<String> expected = new ArrayList<String>();        actual.add("hello");        actual.add("yo");        actual.add("hi");        actual.add("what");        actual.add("bottle");
查看完整描述

1 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

因為words您傳遞給的列表mergeWords永遠不會被清除。mergeWords只會將新元素添加到此列表中,而不關心它已經包含的元素。只需做一個

words.clear();

在。。。之初mergeWords。

.set(int index, E element)或者,您可以使用而不是覆蓋現有元素.add()。但您需要確保列表的大小正確。

一些不相關的評論:

在函數調用中,您始終將列表的大小作為附加參數傳遞(nleftright)。這是多余的(您可以使用 獲取尺寸list.size())。任何多余的東西都很容易變得不一致(即,如果傳遞錯誤的大小會發生什么?)。所以最好刪除這些參數。

當您將元素添加到列表時,您可以使用重載add(int index, E element)。這完全沒問題,但我認為使用重載add(E element)更容易處理,因為您不需要跟蹤在哪里添加元素。重載只會將新元素附加到列表的末尾。


查看完整回答
反對 回復 2024-01-28
  • 1 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號