【问题标题】:Having trouble with sorting排序有问题
【发布时间】:2013-05-11 21:58:41
【问题描述】:

所以我在排序 ArrayList 时遇到问题。我需要在插入方法中使用,所以我基于此编写此代码。这样做的目的是要求用户输入 4 个 3 个字母的单词,然后按字母顺序在 ArrayList 中排序。我一直在尝试不同的事情,但是当我运行代码时,它会对第一个单词进行排序,但会重复它。输出真的取决于我放的话。我觉得我的问题出在 while 循环中,但我一直在尝试不同的方法,但我遇到了同样的问题。非常感谢任何帮助。

import java.util.ArrayList;
import TerminalIO.KeyboardReader;

public class Insert{
    public static void main(String[] args) {
        int i,j;
        String tmp;
        ArrayList<String> words = new ArrayList<String>();
        int run = 4;
        KeyboardReader reader = new KeyboardReader();
        while(run!=0) {
            words.add(reader.readLine("Enter a three letter word: "));
            run--;
        }


        for (j=1; j<words.size(); j++) {
            i = j - 1;
            tmp = words.get(j);

            while ( (i>=0) && (tmp.compareTo(words.get(i)) < 0)){
                words.set(i,tmp); 
                words.set(i+1,words.get(i));
                i--;
            }

       //words.set(i+1,tmp);

        }

        for(int r = 0; r<words.size(); r++)
            System.out.print(words.get(r) + " ");

    }
}

【问题讨论】:

  • 您必须实现自己的排序还是只需要排序?如果您只是想要排序,请尝试 Collections.sort(words)。将按字母顺序排序。
  • 我觉得他是个学生;学生应该至少用手做一次。
  • 是的,我是一名学生,Collection.sort 的概念对我来说并不好,因为我正在尝试学习如何修改插入方法来对字符串进行排序。

标签: java string sorting insertion-sort


【解决方案1】:

您最终出现重复单词的原因是 while 块:

while ( (i>=0) && (tmp.compareTo(words.get(i)) < 0)){
    words.set(i,tmp); 
    words.set(i+1,words.get(i));
    i--;
}

您将i-th 字设置为tmp,然后将i+1-th 字设置为i-th 字,即tmp

恐怕你也有一些代码组织问题。首先,请尝试实际创建一个 Insert 对象,然后对其调用方法。让你的方法更小;每种方法都应该只做一件事。

【讨论】:

  • 我可能在组织代码时遇到问题。当您说我将 i+1 单词设置为 i 单词时,tmp 是 words.get(j),这使其成为不同的索引。我只是对如何以正确的方式对其进行排序感到困惑。
  • 当我运行这部分代码时,不是因为 i = j-1 而从 j 索引中选择的单词切换到它后面的一个索引。在我这样做之后,我将被比较并位于 j 后面的单词放入 j 的位置,只要 while 循环正确,就会这样做
  • 我设法解决了这个问题。我删除了 words.set(i,tmp);从while循环和for循环中,我留下评论的代码我用words.set(i + 1,tmp)替换了它,现在它可以工作了。不过感谢您的支持。
  • 尝试在纸上模拟计算机通常很有用。
【解决方案2】:

为什么不直接使用Collections.sort 而不是自己排序。在你的 while 循环之后看起来像这样:

 while(run!=0){
   words.add(reader.readLine("Enter a three letter word: "));
   run--;
 }
 Collections.sort(words);

【讨论】:

  • 这似乎是个好主意,但我们需要了解插入方法的工作原理。插入法、气泡法等几种方法,我们需要专门使用插入法来制作。
【解决方案3】:

java.util.Collections.sort(list) 将按照其元素的自然顺序对数组进行排序,只要元素实现了Compareable 接口。

【讨论】:

    【解决方案4】:

    如果你需要这样做,你需要在第二个while循环中使用一个String变量,我们称之为tmp2:

       while ( (i>=0) && (tmp.compareTo(words.get(i)) < 0)){
       tmp2 = words.get(i);
            words.set(i,tmp); 
            words.set(i+1,tmp2);
           i--;
        }
    

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      相关资源
      最近更新 更多