英文:
How to remove duplicates and matching original elements from list using java
问题
我已经尝试过使用Set集合来移除重复项,但这并不能解决我在这里提出的问题。
我正在尝试完成以下任务:我有一个列表
Integer [] list1 = {1,2,3,3};
我想要移除重复项,但我还想移除匹配的成对项,所以我想要的结果是
{1,2}
英文:
I have already tried using a Set Collection to remove duplicates but this does not solve what i am asking here.
I am trying to accomplish the following task: I have a list
Integer [] list1 = {1,2,3,3};
i want to remove the duplicates but also I want to remove the matching pair, so the result i want is
{1,2}
答案1
得分: 3
我会使用频率映射来筛选出频率大于2的元素。
- 频率映射
freqMap
的条目为:{1=1, 2=1, 3=2}
,我们只需要筛选出值大于2的条目.filter(e -> e.getValue() < 2)
,在这里是{3=2}
。 - 现在我们有了条目:
{1=1, 2=1}
,但我们只想要键{1, 2}
,所以我们使用map()
函数来获取键:.map(e -> e.getKey())
尝试这样做:
Map<Integer, Long> freqMap = Arrays.stream(list1)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
int[] result = freqMap.entrySet().stream()
.filter(e -> e.getValue() < 2).map(e -> e.getKey()).mapToInt(m -> m).toArray();
System.out.println(Arrays.toString(result));
输出:
[1, 2]
英文:
I would use a frequency map to filter the elements having a frequency greater than 2.
- The frequency map
freqMap
has the entries:{1=1, 2=1, 3=2}
, we just need to filter the entries having a value greater than 2.filter(e -> e.getValue()<2)
which is{3=2}
here. - Now we have the entries:
{1=1, 2=1}
But we want only the keys{1, 2}
so we usemap()
function to get the keys:.map(e -> e.getKey())
Try this:
Map<Integer, Long> freqMap = Arrays.stream(list1)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
int[] result = freqMap.entrySet().stream()
.filter(e -> e.getValue() < 2).map(e -> e.getKey()).mapToInt(m -> m).toArray();
System.out.println(Arrays.toString(result));
Output:
[1, 2]
答案2
得分: 1
你可以使用一个Map。计算元素在一个<int, int>的映射中出现的次数,然后只获取那些计数为1的键。
所以,这就是你的示例内容,
{
1: 1,
2: 1,
3: 2,
}
然后只提取键1和2,因为它们的计数为1。时间和空间复杂度为O(n)。
英文:
You can use a Map. Count the number of times the elements appear in a <int, int> map and get only those keys that have a count of 1.
so then this is what you have for your example,
{
1: 1,
2: 1,
3: 2,
}
Then just extract keys 1 and 2 since they have a count of 1. O(n) time and space.
答案3
得分: 0
我的第一个想法是从列表中获取一个集合,然后移除列表中所有在集合中的元素,接着移除集合中所有在剩余列表中的元素。
Integer[] arr = { 1, 2, 3, 3 };
List<Integer> list = new ArrayList<>(Arrays.asList(arr));
Set<Integer> set = new HashSet<>(list);
for (Iterator<Integer> iterator = set.iterator(); iterator.hasNext();) {
list.remove(iterator.next());
}
set.removeAll(list);
System.out.println(list);
System.out.println(set);
输出:
[3]
[1, 2]
这个方法适用于 Java 8 之前的版本。否则,只需使用 Hülya 给出的 freqMap() 方法。
<details>
<summary>英文:</summary>
My first thought was to get a set from the list, then remove all elements in the list that are in the set, and remove all elements in the set that are in the remaining list.
Integer[] arr = { 1, 2, 3, 3 };
List<Integer> list = new ArrayList<>(Arrays.asList(arr));
Set<Integer> set = new HashSet<>(list);
for (Iterator<Integer> iterator = set.iterator(); iterator.hasNext();) {
list.remove(iterator.next());
}
set.removeAll(list);
System.out.println(list);
System.out.println(set);
Output:
[3]
[1, 2]
This will work with versions of Java less than Java 8. Otherwise just use freqMap() as answered by Hülya.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论