Я получаю некоторые ошибки. Мой массив выглядит так:
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 значений. Я не могу угадать, сколько значений пользователь внесет, как я могу это решить?
Я думаю, что мне нужно как-то удалить все нулевые значения перед сортировкой по алфавиту. Есть идеи?
Вы можете подсчитать введенные значения и Сортировать только ненулевые значения, используя
Arrays.sort(words, 0,inputCount, String.CASE_INSENSITIVE_ORDER);
где inputCount - это счетчик инкапсулирующего бесконечного цикла while.
Вы также можете изменить свой цикл for-loop
for (int a = 0; a < inputCount; a++) {
используйте 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
будет вашим новым массивом без нулевых значений
Вместо того, чтобы беспокоиться о нулевых значениях в вашем наборе, подумайте об этом следующим образом:
Вы можете создать собственный 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()
.
Вы можете использовать java.util.Set для хранения ваших слов. Таким образом, вам не нужно иметь дело с инициализацией или расширением массива.
Вы можете использовать ArrayList
или Set
(или любую другую коллекцию динамического размера) для отслеживания того, сколько строк действительно введено.
Если вы хотите придерживаться заранее созданного массива, вы можете подсчитать, сколько строк действительно прочитано, и только цикл до этой суммы.
Вы можете использовать сортировку двоичной вставки при вводе строк. Это будет более быстрый поиск дубликатов и даст вам упорядоченный список, готовый к выпуску.
Есть много вариантов, но это не кажется хорошим. Поскольку у вас есть 50000 точек, что произойдет, если пользователь попытается ввести еще одно?
java.util.Arrays.stream(words).filter(x -> x != null).count())
;
ArrayList
если вы не уверены вsize
. не кодируйте это жестко