我知道这个问题已经多次回答“如何找到”,但我还有一些其他问题。这是我的代码
public static void main (String [] args){
List<String> l1= new ArrayList<String>();
l1.add("Apple");
l1.add("Orange");
l1.add("Apple");
l1.add("Milk");
//List<String> l2=new ArrayList<String>();
//HashSet is a good choice as it does not allow duplicates
HashSet<String> set = new HashSet<String>();
for( String e: l1){
//if(!(l2).add(e)) -- did not work
if(!(set).add(e)){
System.out.println(e);
}
问题1:列表不起作用,因为List允许重复,而HashSet不是 - 这是正确的假设吗?
问题2:这一行意味着什么:if(!(set).add(e)) 在for循环中,我们检查String e是否在列表l1中,然后该行验证if(!(set).add(e))
此代码将打印apple作为输出,因为它是重复值。
问题3:我怎样才能打印出非重复值,只有Orange和Milk而不是Apple?我试过这种方法,但它仍然打印Apple。 List unique = new ArrayList(new HashSet(l1));
提前感谢您的时间。
答案 0 :(得分:4)
true/false
返回值表示。 true
取得成功。Set<> duplicates
,然后删除所有{{来自duplicates
。答案 1 :(得分:3)
问题1:列表不起作用,因为List允许重复,而HashSet不是 - 这是正确的假设吗?
这是正确的。
问题2:这一行是什么意思:if(!(set).add(e))在for循环中,我们检查String e是否在列表l1中,然后该行验证是否(!(设定)。新增(e))的
此代码将打印apple作为输出,因为它是重复值。
set.add(e)
尝试向集合添加元素,并返回boolean
,表示是否已添加。否定结果将导致忽略新元素并打印重复项。请注意,如果元素存在3次,则会打印两次,依此类推。
问题3:我怎样才能打印出非重复值,只有Orange和Milk而不是Apple?我试过这种方法,但它仍然打印Apple。
List<String> unique= new ArrayList<String>(new HashSet<String>(l1));
有很多方法可以解决这个问题。这个没有最好的表现,但它非常简单:
for (int i = 0; i < l1.size(); i++) {
boolean hasDup = false;
for (int j = 0; j < l1.size(); j++) {
if (i != j && l1.get(i).equals(l1.get(j))) {
hasDup = true;
break;
}
}
if (!hasDup) {
System.out.println(e);
}
}
答案 2 :(得分:3)
1)是的,这是正确的。我们经常使用集来删除重复项。
2)当项目已经在集合中时,add
的{{1}}方法返回false。这就是它用于检查项目中是否存在该项目的原因。
3)为此,您需要计算数组中每个项目的出现次数,将它们存储在哈希映射中,然后打印出计数为HashSet
的项目。或者,您可以这样做(这有点脏并且速度较慢!但是,这种方法比使用哈希映射需要的空间少一些。)
1
答案 3 :(得分:1)
使用/ java8 power ...
public static void main(String[] args) {
List<String> l1 = new ArrayList<>();
l1.add("Apple");
l1.add("Orange");
l1.add("Apple");
l1.add("Milk");
// remove duplicates
List<String> li = l1.parallelStream().distinct().collect(Collectors.toList());
System.out.println(li);
// map with duplicates frequency
Map<String, Long> countsList = l1.stream().collect(Collectors.groupingBy(fe -> fe, Collectors.counting()));
System.out.println(countsList);
// filter the map where only once
List<String> l2 = countsList.entrySet().stream().filter(map -> map.getValue().longValue() == 1)
.map(map -> map.getKey()).collect(Collectors.toList());
System.out.println(l2);
}