1

所以我在排序 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) + " ");

    }
}
4

4 回答 4

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 对象,然后对其调用方法。让你的方法更小;每种方法都应该只做一件事。

于 2013-05-11T22:09:39.747 回答
0

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

 while(run!=0){
   words.add(reader.readLine("Enter a three letter word: "));
   run--;
 }
 Collections.sort(words);
于 2013-05-11T22:09:25.933 回答
0

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

于 2013-05-11T22:10:27.250 回答
0

如果您需要以这种特殊方式执行此操作,则需要在第二个 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--;
    }
于 2013-05-11T22:55:04.103 回答