2013-05-11 4 views
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) + " "); 

    } 
} 
+0

Вы должны реализовать свой собственный вид или просто требуется Сортировать? Если вы просто хотите сортировать, попробуйте Collections.sort (words). Будет сортироваться в алфавитном порядке. – arynaq

+1

Я думаю, что он студент; студенты должны делать что-то вручную хотя бы один раз. –

+1

Да, я ученик, концепция Collection.sort не подходит для меня, потому что я пытаюсь научиться модифицировать метод вставки для сортировки строк. – Johngianni

ответ

0

Почему бы просто не использовать Collections.sort вместо сортировки себя. Это будет выглядеть следующим образом после время цикла:

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

Это действительно хорошая идея, но нам нужно понять, как работает метод вставки. Существует несколько методов, таких как метод вставки и метод пузырьков, и нам нужно сделать это с помощью метода вставки. – Johngianni

1

Причина вы в конечном итоге с дубликатами словами является while блок:

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

Вы устанавливаете i -ю слово tmp, а затем установите i+1 -е слово на i-й слово, которое равно tmp.

Боюсь, что у вас есть проблемы с организацией кода. Во-первых, попробуйте создать объект Insert, а затем вызвать методы. Сделайте ваши методы меньше; каждый метод должен делать только одно.

+0

У меня, вероятно, возникают проблемы с организацией кода. Когда вы говорите, что я устанавливаю i + 1 слово в слово i, tmp - это word.get (j), что делает его другим индексом. Я просто смущен тем, как правильно это сортировать. – Johngianni

+0

Когда я запускаю эту часть кода, это не означает, что слово, выбранное из индекса j, стоит за индексом, потому что i = j-1. После этого я поставил слово, которое было сопоставлено, и было расположено за j в месте j, и это делается так долго, как цикл while правильный – Johngianni

+0

Мне удалось исправить эту проблему. Я удалил words.set (i, tmp); из цикла while и в цикле for код, который я оставил комментируемым, я заменил его словами .set (i + 1, tmp), и теперь он работает. Спасибо за поддержку. – Johngianni

0

Если вам нужно сделать, это именно этот путь, вы должны использовать переменную типа 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--; 
    } 
Смежные вопросы