当前位置: 首页 > 知识库问答 >
问题:

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

姬实
2023-03-14

我试图在一个大小为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]

谢谢你的指点!

共有1个答案

薛保臣
2023-03-14

因为传递给合并文字的文字列表永远不会被清除mergeWords将只向该列表中添加新元素,而不关心它已经包含的元素。简单地做一个

words.clear();

在合并文字的开头。

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

一些不相关的评论:

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

将元素添加到列表时,使用重载add(int index,E element)。这很好,但我认为使用重载添加(E元素)要容易得多,因为您不需要跟踪添加元素的位置。重载只会将新元素附加到列表的末尾。

 类似资料:
  • 问题内容: 给定一个像这样的字典: 如何创建一个字典列表,该列表结合了第一个字典键的各种值?我想要的是: 问题答案: 我认为您想要笛卡尔积,而不是排列,在这种情况下可以提供帮助:

  • 我正试图连载我的表格,但由于某种原因我不能使它工作。表单的系列化工作正在进行。但问题是,我需要在之后添加一个列表,因为它不是表单的一部分,并且在这样做时,当它到达我的控制器endpoint时,我的模型是空的。 我正在打的控制器的功能: 对象产品运行良好,但模型为。 有没有人有什么建议,如何解决这个问题?:-) 请不要介意像Model这样的对象的名称,这在我们的项目中被命名为其他的东西。

  • 谢谢你。

  • 我有: 我需要根据我做的字母表排列单词。 我目前的方法是使用for cycles。 我已经为这段代码编写了一些基础,但在开始认真的“循环”之前,我想问一下还有什么其他方法。 谢谢 后续更改Java中字符串列表中的特定字符

  • 所以我做了一个函数 因此,它所做的是获取一个字符串,将其拆分,并生成一个字典,其中键是单词,值是它出现的次数。 好的,我现在要做的是,做一个函数,它接受这个函数的输出,并产生一个如下格式的列表- ((超过1个字母的单词列表),(最常用单词列表),(最长单词列表)) 另外,例如,假设两个单词出现了3次,并且两个单词都有6个字母长,那么这两个单词都应该包含在(最频繁的)和(最长的)列表中。 因此,到目

  • 我正试图想出一个分而治之的算法来合并j个排序列表和n个元素,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望合并算法更高效,如下所示: 合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表合并,以此类推,该列表取O(j*jn)。