我的计划如下:
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
我想我在这里或多或少地做类似的事情。 谁能帮助我显示正确的值?
提前致谢
答案 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类而不是原语