java.util.Arrays$ArrayList 无法转换为 java.util.LinkedHashSet

java.util.Arrays$ArrayList cannot be cast to 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 的帮助下这样做有什么好处?

转换将失败,因为两种类型不相关:LinkedHashSet 既不是 Arrays$ArrayList 的超类型也不是其子类型,因此无法引用 Arrays$ArrayList包含可以转换为 LinkedHashSet.

的内容

您可以非常轻松地从数组创建 LinkedHashSet:

LinkedHashSet<String> lhs = new LinkedHashSet<>(Arrays.asList(strMOd));

此代码与您以前的代码之间的区别在于,此代码创建了一个新的 LinkedHashSet 实例,并复制了列表中的元素。

两件事,

首先,Arrays.asList(strMOd) returns 你 ArrayList 是在 Array.java 中定义的内部 class 并且它不能转换为 LinkedHashSet 作为两者都是不同的类型。

其次,对于您的示例,您不需要进行任何转换或转换。 Arrays.asList 返回的 ArrayList 实现了 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));
            }

        }