Java 使用';收藏。频率';获取给定一个值的实例数

Java 使用';收藏。频率';获取给定一个值的实例数,java,collections,frequency,Java,Collections,Frequency,为了简化我正在做的事情,让我们使用我修改了一些位的示例 package test; import java.util.StringTokenizer; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; class Employee { private String emp

为了简化我正在做的事情,让我们使用我修改了一些位的示例

package test;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


class Employee {
        private String empno;
        private String empName;

        public Employee(String empno, String empName ) {
            this.empno = empno;
            this.empName = empName;
        }

        public String getEmpno() {
            return empno;
        }

        public void setEmpno(String empno) {
            this.empno = empno;
        }

        public String getEmpName() {
            return empName;
        }

        public void setEmpName(String empName) {
            this.empName = empName;
        }
        @Override
        public String toString() {
            return "Empno is "+ empno + " Empname is " + empName;
        }
        public Employee() {
            // TODO Auto-generated constructor stub
        }

        @Override
        public boolean equals(Object arg0) {
            // TODO Auto-generated method stub
            boolean flag = false;
            Employee employee = (Employee) arg0;
            if(null!= employee && employee.getEmpName().equalsIgnoreCase(empName) && employee.getEmpno().equalsIgnoreCase(empno)){
                flag = true;
            }
            return flag;
        }

    }


public class Test  {
    public static void main(String[] args) {

        List<Employee> empList = new ArrayList<Employee>();
        empList.add(new Employee("001", "Shidhar"));
        empList.add(new Employee("002", "Pathy"));
        empList.add(new Employee("003", "Sahana"));
        empList.add(new Employee("003", "Sahana"));
        empList.add(new Employee("004", "Sahana"));
        empList.add(new Employee("003", "Sahana"));

        //Get the occurrence of "new Employee("003", "Sahana")" from empLists
        //int sahanaCount = Collections.frequency(empList, new Employee("003"));
        //System.out.println("Count of sahana is : " +sahanaCount);

        Set<Employee> uniqueId = new HashSet<Employee>(empList);
        for (Employee emId : uniqueId) {
            System.out.println("The emp with id "+emId.getEmpno()+" was repeated: "
                    + Collections.frequency(empList, emId.getEmpName()));
        }

    }
}
封装测试;
导入java.util.StringTokenizer;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.HashSet;
导入java.util.List;
导入java.util.Set;
班级员工{
私有字符串empno;
私有字符串名称;
公共雇员(字符串empno,字符串empName){
this.empno=empno;
this.empName=empName;
}
公共字符串getEmpno(){
返回empno;
}
public void setEmpno(字符串empno){
this.empno=empno;
}
公共字符串getEmpName(){
返回empName;
}
public void setEmpName(字符串empName){
this.empName=empName;
}
@凌驾
公共字符串toString(){
返回“Empno is”+Empno+“Empname is”+Empname;
}
公职人员(){
//TODO自动生成的构造函数存根
}
@凌驾
公共布尔等于(对象arg0){
//TODO自动生成的方法存根
布尔标志=假;
Employee=(Employee)arg0;
if(null!=employee&&employee.getEmpName().equalsIgnoreCase(empName)&&employee.getEmpno().equalsIgnoreCase(empno)){
flag=true;
}
返回标志;
}
}
公开课考试{
公共静态void main(字符串[]args){
List empList=new ArrayList();
添加(新员工(“001”,“Shidhar”));
添加(新员工(“002”,“path”));
添加(新员工(“003”、“萨哈纳”);
添加(新员工(“003”、“萨哈纳”);
添加(新员工(“004”、“萨哈纳”);
添加(新员工(“003”、“萨哈纳”);
//从雇员列表中获取“新雇员”(“003”,“萨哈纳”)”的出现
//int sahanaCount=Collections.frequency(雇员列表,新雇员(“003”);
//System.out.println(“sahana计数为:“+sahana计数”);
Set uniqueId=新哈希集(empList);
对于(员工emId:uniqueId){
System.out.println(“重复了id为“+emId.getEmpno()+”的emp:”
+Collections.frequency(empList,emId.getEmpName());
}
}
}
是否可以使用
Collections.frequency
查找给定一个变量的频率,例如
Collections.frequency(雇主,“Sahana”)得到4


另一种选择是我可以使用HashMap来保持计数,但假设我对
集合的频率印象深刻,并尝试使用它。

不,考虑到
等于
的实现,这是不可能的。在Java-8中,您可以使用流API而不是
Collections.frequency

empList.stream().map(Employee::getEmpName).filter(emId.getEmpName()::equals).count();

不,这是不可能的,因为您实现的
等于
。在Java-8中,您可以使用流API而不是
Collections.frequency

empList.stream().map(Employee::getEmpName).filter(emId.getEmpName()::equals).count();

返回指定集合中等于的元素数 指定的对象。更正式地说,返回元素e的数量 在集合中,使得(o==null?e==null:o.equals(e))

所以是的,你可以使用
Collections.frequency
。但是您必须小心使用equals方法,并根据您的实现重写它,这将从方法本身为
集合.frequency
方法识别相等的对象

返回指定集合中等于的元素数 指定的对象。更正式地说,返回元素e的数量 在集合中,使得(o==null?e==null:o.equals(e))


所以是的,你可以使用
Collections.frequency
。但是,您必须小心使用equals方法,并根据您的实现重写它,这将为
集合标识相等的对象。频率
方法
集合
不适合多次存储对象。设置从中删除重复项。您需要在代码中进行一些更改才能实现这一点

  • 使用
    ArrayList
    或任何其他列表实现,而不是
    HashSet
  • equals()
    方法中,对象的相等是通过比较
    empno
    empName
    来完成的。因此,在创建
    empno
    对象时,在添加到集合中时应使用相同的
    empno
    值以通过相等比较。否则,需要修改equal()方法
代码更改为“003”而不是“004”

并删除下面的行

Set<Employee> uniqueId = new HashSet<Employee>(empList);
最后传递
employee
实例,而不是传递
employee
实例的
empName
。这将打印列表中存在的重复对象的数量。这就是
Collections.frequency
方法的目的

要获得基于“empName”的计数,您应该使用如下自定义实现

private int getCount(String empName){
    int count = 0;
    for (Employee employee : empList) {
        if(employee.getEmpName() != null && employee.getEmpName().equals(empName)){
count++;
}
            }
return count;
}      

集合
不适合多次存储对象。设置从中删除重复项。您需要在代码中进行一些更改才能实现这一点

  • 使用
    ArrayList
    或任何其他列表实现,而不是
    HashSet
  • equals()
    方法中,对象的相等是通过比较
    empno
    empName
    来完成的。因此,在创建
    empno
    对象时,在添加到集合中时应使用相同的
    empno
    值以通过相等比较。否则,需要修改equal()方法
代码更改为“003”而不是“004”

并删除下面的行

Set<Employee> uniqueId = new HashSet<Employee>(empList);
最后传递
employee
实例,而不是传递的
empName