如何在Java中显示具有整数值的Set中的元素

时间:2014-11-11 06:35:55

标签: java arrays object set hashset

我的计划如下:

private void removeElementsFromSecond(int[] arr1, int[] arr2) 
{
    List list1 = Arrays.asList(arr1);
    Set<Integer> set1 = new LinkedHashSet<Integer>(list1);
    List list2 = Arrays.asList(arr2);
    Set<Integer> set2 = new LinkedHashSet<Integer>(list2);
    set2.removeAll(set1);

    Iterator itr = set2.iterator();

    while (itr.hasNext()) {
        System.out.println(itr.next());
    }
}

输入是:

int[] arr1 = {1,2,3,4,5};
int[] arr2 = {0,1,2,3,4};

但输出显示为

[I@45bab50a

我在冲浪时遇到了这个链接

http://www.java-examples.com/iterate-through-elements-java-hashset-example

我想我在这里或多或少地做类似的事情。 谁能帮助我显示正确的值?

提前致谢

5 个答案:

答案 0 :(得分:3)

Arrays.asList(arr1)数组上调用int[]会生成List,其单个元素就是该数组。这就是为什么Set有一个元素,打印它会打印出数组元素。

改为使用Integer[]数组。

private void removeElementsFromSecond(Integer[] arr1, Integer[] arr2) 
{
    List list1 = Arrays.asList(arr1);
    Set<Integer> set1 = new LinkedHashSet<Integer>(list1);
    List list2 = Arrays.asList(arr2);
    Set<Integer> set2 = new LinkedHashSet<Integer>(list2);
    set2.removeAll(set1);

    Iterator itr = set2.iterator();

    while (itr.hasNext()) {
        System.out.println(itr.next());
    }
}

答案 1 :(得分:0)

List list1 = Arrays.asList(arr1);

问题实际存在的地方。 Arrays.asList(arr1)将返回列表的“更改”更改为数组。 List<Integer> list1 = Arrays.asList(arr1);提出了类强制转换异常。

写这样做(使用#java8)

List<Integer> list1 = new ArrayList<Integer>();
Collections.addAll(list1, Arrays.stream(arr1).boxed().toArray(Integer[]::new));
...
List<Integer> list2 = new ArrayList<Integer>();
Collections.addAll(list2, Arrays.stream(arr2).boxed().toArray(Integer[]::new));

如果你没有使用#java8,那么你需要创建Integer数组并将每个int转换为Integer并将它们添加到数组中并将其转换为{{ 1}}

List

我认为如果使用Integer[] arryInt1 = new Integer[arr1.length]; for (int i = 0; i < arr1.length; i++) { arryInt1[i] = Integer.valueOf(arr1[i]); } List<Integer> list1 = Arrays.asList(arr1); 本身作为来源会更好,那么它会更容易。

Integer[]

答案 2 :(得分:0)

如果您可以在代码中使用泛型并声明正确的类型,那么您就会明白这里发生了什么。所以,如果我使用泛型,我得到如下:

private static void removeElementsFromSecond(int[] arr1, int[] arr2) {
    List<int[]> list1 = Arrays.asList(arr1);
    //blah blah
}

请参阅Arrays.asList here

的定义

所以在你的情况下它会返回你的List(假设类型为array的对象,即int [] .class)。当您需要使用集合时,您应该使用Object而不是基元。因此,如果您将数组定义为:

Integer[] arr1 = { 1, 2, 3, 4, 5 };
Integer[] arr2 = { 0, 1, 2, 3, 4 };

并在您的方法中使用以下内容:

private void removeElementsFromSecond(Integer[] arr1, Integer[] arr2) {
    List<Integer> list1 = Arrays.asList(arr1);
    //blah blah
}

然后您的代码将完美运行。截至目前,List的每个元素都将包含一个数组本身而不是数组中的单个元素。

答案 3 :(得分:0)

您可以使用此代码

 private void removeElementsFromSecond(int[] arr1, int[] arr2) {
        Set<Integer> set1 = new LinkedHashSet<Integer>();
        for (int i : arr1) {
            set1.add(i);
        }
        Set<Integer> set2 = new LinkedHashSet<Integer>();
        for (int i : arr2) {
            set2.add(i);
        }
        set2.removeAll(set1);

        Iterator<Integer> itr = set2.iterator();

        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
    }

答案 4 :(得分:0)

刚刚修改了一下

private static void removeElementsFromSecond(Integer[] arr1, Integer[] arr2) {
    List list1 = Arrays.asList(arr1);
    Set<Integer> set1 = new LinkedHashSet<Integer>(list1);
    List list2 = Arrays.asList(arr2);
    Set<Integer> set2 = new LinkedHashSet<Integer>(list2);
    set2.removeAll(set1);
    Iterator itr = set2.iterator();
    while (itr.hasNext()) {
        System.out.println(itr.next());
    }
}
public static void main(String[] args) {
    Integer[] arr1 = { 1, 2, 3, 4, 5 };
    Integer[] arr2 = { 0, 1, 2, 3, 4 };
    removeElementsFromSecond(arr1, arr2);
}

Arrays.asList(arr)将给出int []而不是int的列表。相反,你应该使用Wrapper类而不是原语