gpt4 book ai didi

java - 对单词列表实现合并排序 - 原始单词附加回列表?

转载 作者:行者123 更新时间:2023-11-30 05:25:41 28 4
gpt4 key购买 nike

我正在尝试对大小为 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");

expected.add("bottle");
expected.add("hello");
expected.add("hi");
expected.add("what");
expected.add("yo");

mergeSortWords(actual.size(), actual);
Assert.assertEquals(expected, actual);

我收到:

java.lang.AssertionError: 
Expected :[bottle, hello, hi, what, yo]
Actual :[bottle, hello, hi, what, yo, hello, yo, hi, what, bottle]

感谢您的指点!

最佳答案

因为您传递给 mergeWordswords 列表永远不会被清除。 mergeWords 只会将新元素添加到此列表中,而不关心它已包含的元素。只需做一个

words.clear();

位于mergeWords的开头。

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

一些不相关的评论:

在函数调用中,您始终将列表的大小作为附加参数传递(nleftright)。这是多余的(您可以使用 list.size() 获取大小)。任何多余的东西都很容易变得不一致(即,如果传递错误的大小会发生什么?)。因此最好删除这些参数。

当您向列表添加元素时,您可以使用重载add(int index, E element)。这完全没问题,但我认为使用重载 add(E element) 更容易处理,因为您不需要跟踪在哪里添加元素。重载只会将新元素追加到列表末尾。

关于java - 对单词列表实现合并排序 - 原始单词附加回列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58676783/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com