Массивы $ArrayList нельзя преобразовать в java.util.LinkedHashSet.
Я хочу написать программу Java, которая даст мне частоту букв в заданном String
,
Я попробовал это:
public void frequencyOfLetter() {
String strMOd[] = "Hurricane.".split("");
LinkedHashSet<String> lhs = (LinkedHashSet<String>) Arrays.asList(strMOd);
for (String letter : lhs) {
if (lhs.contains(letter)) {
System.out.println(letter + " " + Collections.frequency(lhs, letter));
}
}
}
Почему я использую LinkedHashSet
потому что я не хочу дубликатов. Однако это дает мне ошибку, что это своего рода кастинг неправильный.
Поэтому я использовал это как несколько лишних строк кода:
List<String> lhs = Arrays.asList(strMOd);
LinkedHashSet<String> lhsmod = new LinkedHashSet<String>(lhs);
Почему предыдущий код выдавал эту ошибку и что лучше делать с помощью LinkedHashSet
?
2 ответа
Приведение не удастся, потому что два типа не связаны: LinkedHashSet
не является ни супертипом, ни подтипом Arrays$ArrayList
так что нет никакой ссылки на Arrays$ArrayList
может содержать что-то, что может быть приведено к LinkedHashSet
,
Вы можете очень легко создать LinkedHashSet из массива:
LinkedHashSet<String> lhs = new LinkedHashSet<>(Arrays.asList(strMOd));
Разница между этим кодом и вашим предыдущим кодом заключается в том, что этот код создает новый экземпляр LinkedHashSet
Копирование в элементах списка.
Две вещи,
Первый, Arrays.asList(strMOd)
возвращает вас ArrayList
который является внутренним классом, определенным в Array.java
и это не может быть приведено к LinkedHashSet
как оба разные типы.
Во-вторых, для вашего примера вам не нужно выполнять кастинг или конвертации.ArrayList
вернулся Arrays.asList
инвентарь List<>
, а также Collections.frequency
принимает все, что реализует Collection
и в качестве List
расширяет этот интерфейс, вы могли бы сделать это.
String strMOd[] = "Hurricane.".split("");
List<String> lhs = Arrays.asList(strMOd);
for (String letter : lhs) {
if (lhs.contains(letter)) {
System.out.println(letter + " "
+ Collections.frequency(lhs, letter));
}
}