Удалите все нулевые значения массива перед сортировкой

1

Я получаю некоторые ошибки. Мой массив выглядит так:

 String words[] = new String[50000];

Пользователю предлагается ввести значения в массив

words[i]=c.readLine();

Программа выйдет из цикла бесконечного цикла, когда будут введены дублирующиеся значения. Теперь программа должна сортировать массив в алфавитном порядке, но он пытается отсортировать некоторые из нулевых значений и возвращает ошибки.

Arrays.sort(words, String.CASE_INSENSITIVE_ORDER);         
for (int a = 0; a < words.length; a++) {
    c.println(words[a]);
}

Эта программа будет работать только в том случае, если пользователь вводит ровно 50000 значений. Я не могу угадать, сколько значений пользователь внесет, как я могу это решить?

Я думаю, что мне нужно как-то удалить все нулевые значения перед сортировкой по алфавиту. Есть идеи?

  • 2
    используйте ArrayList если вы не уверены в size . не кодируйте это жестко
Теги:
arrays
sorting

5 ответов

0
Лучший ответ

Вы можете подсчитать введенные значения и Сортировать только ненулевые значения, используя

Arrays.sort(words, 0,inputCount, String.CASE_INSENSITIVE_ORDER);

где inputCount - это счетчик инкапсулирующего бесконечного цикла while.


Вы также можете изменить свой цикл for-loop

for (int a = 0; a < inputCount; a++) {
  • 0
    Он сортирует массив, но выплевывает <null> очень долго
  • 0
    Благодарю. Я изменил свой ответ.
Показать ещё 1 комментарий
1

используйте ArrayList если вы не уверены в size. не перегружайте его.

Но если вы настаиваете на использовании array, что вы можете попробовать:

int notNull=words.length;    
for(int i= 0;i<words.length;i++){
    if(words[i]==null){
        notNull=i;
    break;
}
}
String[] newWords=Arrays.copyOfRange(words, 0, notNull);

newWords будет вашим новым массивом без нулевых значений

0

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

  • Если вы сравниваете одно ненулевое значение и одно нулевое значение, выигрывает ненулевое значение.
  • Если вы сравниваете два не нулевых значения, ни один из них не выигрывает.

Вы можете создать собственный Comparator<String> и использовать его в Arrays#sort. В стороне, String.CASE_INSENSITIVE_ORDER также является Comparator<String>, но он не совсем заполняет необходимость, которая, как вам кажется.

Вот пример реализации:

public class NullAwareStringComparator implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        if (o1 == null && o2 == null) {
            return 2;
        } else if (o1 == null) {
            return 1;
        } else if (o2 == null) {
            return -1;
        } else {
            return o1.compareToIgnoreCase(o2);
        }
    }
}

Затем вы вызываете свой метод сортировки следующим образом:

Arrays.sort(words, new NullAwareStringComparator());

Это помещает все null значения в конец массива. Если вы хотите обратный порядок, переверните знак чисел, возвращаемых методом compare.

В качестве альтернативы, если вы не знаете/ухаживаете за количеством элементов, которые вы можете сохранить, рассмотрите вместо этого использование TreeSet<String> - это имеет дополнительное преимущество при игнорировании повторяющихся записей.

Set<String> sortedStrings = new TreeSet<>(new NullAwareStringComparator());

Вместо этого вы могли бы использовать String.CASE_INSENSITIVE_ORDER в качестве компаратора, так как на данный момент вы почти не беспокоитесь о null записях, как раньше:

Set<String> sortedStrings = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

... и для сортировки коллекции вы бы назвали Collections.sort().

0

Вы можете использовать java.util.Set для хранения ваших слов. Таким образом, вам не нужно иметь дело с инициализацией или расширением массива.

0

Вы можете использовать ArrayList или Set (или любую другую коллекцию динамического размера) для отслеживания того, сколько строк действительно введено.

Если вы хотите придерживаться заранее созданного массива, вы можете подсчитать, сколько строк действительно прочитано, и только цикл до этой суммы.

Вы можете использовать сортировку двоичной вставки при вводе строк. Это будет более быстрый поиск дубликатов и даст вам упорядоченный список, готовый к выпуску.

Есть много вариантов, но это не кажется хорошим. Поскольку у вас есть 50000 точек, что произойдет, если пользователь попытается ввести еще одно?

  • 0
    Я вижу, я почти нашел способ сделать это. Как я могу посчитать, сколько ненулевых значений в массиве?
  • 0
    @unableToCompile, если используется Java 8: java.util.Arrays.stream(words).filter(x -> x != null).count()) ;
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню