Как я могу алфавитизировать этот ArrayList без использования метода Collections.sort? - PullRequest
1 голос
/ 19 марта 2020

Это школьное задание, которое я делаю для развлечения. В этом назначении я должен вставить слова в ArrayList, затем вручную остановить ArrayList, а затем программа должна алфавитизировать его. Но проблема в том, что каждый урок говорит мне использовать метод Collections.sort или что-то в этом роде, но мы не узнали этого в классе, поэтому, очевидно, мы не должны его использовать. Кроме того, задача этого назначения состоит в том, чтобы отсортировать все внутри 1 ArrayList вместо того, чтобы брать слова из ArrayList, алфавитизировать слова, а затем вставлять алфавитные слова во второй ArrayList. Может ли кто-нибудь помочь мне разобраться с этим? Я ничего не написал в разделе алфавита, потому что я не знаю, с чего начать. Спасибо.

import java.util.*;

public class LexiHeaven {

    public static void main(String[] args) {

        ArrayList<String> words = new ArrayList<String>();
        Scanner sc = new Scanner(System.in);
        System.out.println("Please enter a word into the Array (enter stop if you want to stop):");
        String w = sc.nextLine();

        while (!w.equals("stop")) {
            words.add(w);
            System.out.println("Please enter a word into the Array (enter stop if you want to stop):");
            w = sc.nextLine();
        }

        System.out.println(words);
        System.out.println("Alphabetize the ArrayList:");

        String temp = "";
        for (int i = 0; i < words.size(); i++) {
            for (int j = i + 1; j < words.size(); j++) {
                if (words.get(i).compareTo(words.get(j)) > 0) {
                    temp = words.get(i);
                    words.set(i, words.get(j));
                    words.set(j, temp);
                }
            }
        }
        System.out.println(words);
    }
}

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Похоже, я не могу хорошо объяснить себя в комментарии, поэтому я позволю своему коду говорить за меня.

Ваш l oop, который реализует сортировку пузырьков, должен выглядеть следующим образом:

String temp;
for (int i = 0; i < words.size(); i++) {
    for (int j = i + 1; j < words.size(); j++) {
        if (words.get(i).compareTo(words.get(j)) < 0) {
            temp = words.get(i);
            words.set(i, words.get(j));
            words.set(j, temp);
        }
    }
}

Обратите внимание, что это сортирует список в порядке по убыванию из-за выполняемого вами сравнения, т.е.

if (words.get(i).compareTo(words.get(j)) < 0) {

Если вы хотите, чтобы возрастал порядок, измените < 0 to > 0

В своем комментарии 1016 * я пытался объяснить, что вы не присваивали значение локальной переменной temp внутри l oop.

1 голос
/ 19 марта 2020

Давайте посмотрим на код, который вы написали:

String temp;
for (int i = 0; i < words.size(); i++) {
  for (int j = i + 1; j < words.size(); j++) {
    if (words.get(i).compareTo(words.get(j)) < 0) {
      words.set(i, temp);
      words.set(i,j);
      words.set(j, temp);
    }
  }
}

Хотя на самом деле это ничего не меняет. Давайте опишем этот внутренний l oop в терминах объяснения кода:

if words[i] is alphabetically "lower" than words[j], do:
  - write the content of "temp" into words[i]
  - write the number "j" into words[i]
  - write the content of "temp" into words[j]

Здесь есть несколько проблем:

  1. вы, вероятно, хотите отменить это условие, потому что вы хотите (z, a) становиться (a, z), а не наоборот.
  2. вы никогда не будете присваивать значение temp, поэтому этот код фактически "испортит" ваш список со значениями null ,
  3. у вас есть две строки, которые пишут в один и тот же индекс, поэтому первая words.set(i, temp) в основном «ничего не делает», даже если она и поступила правильно.

Давайте исправим что: замена двух элементов в любом массиве или списке требует третьего временного заполнителя. Вы помещаете один из двух элементов, которые хотите поменять, во временный заполнитель, затем перезаписываете этот элемент значением другого элемента, а затем перезаписываете элемент over значением временного заполнителя:

  1. начнем со списка (a, b), желания поменять местами элементы 0 и 1 и некоторого temp var
  2. set temp = list [0], так что теперь у нас есть list=(a,b), temp=a.
  3. список перезаписи [0] со списком [1], поэтому теперь у нас есть list=(b,b), temp=a
  4. список перезаписи [1] с вашим временным значением, поэтому теперь у нас есть list=(b,a), temp=a

Вы используете переменную temp и код ArrayList, так что это будет:

String temp;
for(...) {
  for(...) {
   if (...) {
     temp = words.get(i);
     words.set(i, words.get(j));
     words.set(j, temp);
   }
  }
}
...