我试图在一个大小为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++));
}
}
I单元测试如下:
@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]
谢谢你的指点!
因为传递给合并文字的文字列表永远不会被清除mergeWords将只向该列表中添加新元素,而不关心它已经包含的元素。简单地做一个
words.clear();
在合并文字的开头。
或者,您可以使用
. set(int index, E元素)
而不是. add()
覆盖现有元素。但是您需要确保列表的大小正确。
一些不相关的评论:
在函数调用中,始终将列表的大小作为附加参数传递(
n
、
left
、
right
)。这是多余的(您可以使用list.size()获取大小)。任何多余的东西都很容易变得不一致(即,如果传递的尺寸错误,会发生什么情况?)。因此,最好删除这些参数。
将元素添加到列表时,使用重载add(int index,E element)。这很好,但我认为使用重载添加(E元素)要容易得多,因为您不需要跟踪添加元素的位置。重载只会将新元素附加到列表的末尾。
问题内容: 给定一个像这样的字典: 如何创建一个字典列表,该列表结合了第一个字典键的各种值?我想要的是: 问题答案: 我认为您想要笛卡尔积,而不是排列,在这种情况下可以提供帮助:
我正试图连载我的表格,但由于某种原因我不能使它工作。表单的系列化工作正在进行。但问题是,我需要在之后添加一个列表,因为它不是表单的一部分,并且在这样做时,当它到达我的控制器endpoint时,我的模型是空的。 我正在打的控制器的功能: 对象产品运行良好,但模型为。 有没有人有什么建议,如何解决这个问题?:-) 请不要介意像Model这样的对象的名称,这在我们的项目中被命名为其他的东西。
谢谢你。
我有: 我需要根据我做的字母表排列单词。 我目前的方法是使用for cycles。 我已经为这段代码编写了一些基础,但在开始认真的“循环”之前,我想问一下还有什么其他方法。 谢谢 后续更改Java中字符串列表中的特定字符
所以我做了一个函数 因此,它所做的是获取一个字符串,将其拆分,并生成一个字典,其中键是单词,值是它出现的次数。 好的,我现在要做的是,做一个函数,它接受这个函数的输出,并产生一个如下格式的列表- ((超过1个字母的单词列表),(最常用单词列表),(最长单词列表)) 另外,例如,假设两个单词出现了3次,并且两个单词都有6个字母长,那么这两个单词都应该包含在(最频繁的)和(最长的)列表中。 因此,到目
我正试图想出一个分而治之的算法来合并j个排序列表和n个元素,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望合并算法更高效,如下所示: 合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表合并,以此类推,该列表取O(j*jn)。