-2

我想编写一个 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

4

2 回答 2

2

转换将失败,因为两种类型不相关:LinkedHashSet既不是 的超类型也不是 的子类型Arrays$ArrayList,因此对 an 的引用Arrays$ArrayList不可能包含可以转换为 a 的东西LinkedHashSet

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

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

这段代码和你之前的代码之间的区别在于,这段代码创建了一个新的实例LinkedHashSet,复制了列表的元素。

于 2015-09-29T11:49:39.770 回答
0

两件事情,

首先,Arrays.asList(strMOd)返回您ArrayList定义的内部类,Array.java并且不能转换为,LinkedHashSet因为两者都是不同的类型。

其次,对于您的示例,您不需要进行任何转换或转换。 ArrayListArrays.asListimplements返回List<>,并Collections.frequency接受任何实现CollectionList扩展该接口的内容,您可以这样做。

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));
            }

        }
于 2015-09-29T12:08:48.813 回答