java - 查找应该为每一行的一个参数至少定义一个值的记录

标签 java algorithm data-structures collections logic

我有以下列表 ->

列表地址;

员工

名字, 年龄 公司 工资

Name                    Age             Company     Salary    
A                       21              comp_A       100        
A                       21              comp_A              
A                       21              comp_A          
B                       22              comp_B              
B                       22              comp_B       200        
C                       23              comp_C       300        
D                       24              comp_D          
E                       25              comp_E         

我想要那些记录,在这些记录中,对于相同的名字、年龄、公司,我至少应该定义一个薪水。 由于此重复记录代表同一名员工,因此他们必须有薪水。

欣赏逻辑将获取满足此条件和不满足条件的记录,例如 D/E 员工的最后两行没有为工资定义任何值, 我也应该得到这些值。

最佳答案

将列表转换为流,删除重复项并收集回新列表。 您有 2 个选项,分别为 distinct(删除所有字段的重复项)和 distinctByKey (根据特定条件或仅某些字段删除重复项)

https://howtodoinjava.com/java8/java-stream-distinct-examples/

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class FindR {

public static void main(String[] args)
{
    ArrayList<Employee> l = new ArrayList();
    l.add(new FindR().new Employee("A",21,"comp_A",100.0));
    l.add(new FindR().new Employee("A",21,"comp_A",100.0));
    l.add(new FindR().new Employee("A",21,"comp_A",null));
    l.add(new FindR().new Employee("A",21,"comp_A",null));
    l.add(new FindR().new Employee("B",22,"comp_B",null));
    l.add(new FindR().new Employee("B",22,"comp_B",200.0));
    l.add(new FindR().new Employee("C",23,"comp_C",300.0));
    l.add(new FindR().new Employee("D",24,"comp_D",null));
    l.add(new FindR().new Employee("E",25,"comp_E",null));

    List<Employee> l_salaryNotNull = l.stream().filter(p->p.salary !=null).collect(Collectors.toList());
    System.out.println("_salalary defined_");
    l_salaryNotNull.stream().forEach(System.out::println);

    System.out.println("_unique by name,age,company_");
    List<String> l_uByNAC = l.stream().map(p->p.name+":"+p.age+":"+p.company).distinct().collect(Collectors.toList());

    //or remove first null values and then get keys
    //List<String> l_uByNAC = l.stream().filter(p->p.salary !=null).map(p->p.name+":"+p.age+":"+p.company).distinct().collect(Collectors.toList());

    l_uByNAC.stream().forEach(System.out::println);
    //eg: process first record 
    String aux[] = l_uByNAC.get(0).split(":");
    System.out.println("keys for search in initial list | name="+aux[0]+",age="+aux[1]+",company="+aux[2]);
}


public class Employee 
{
    public String name;
    public Integer age;
    public String company;
    public Double salary;
    public Employee(String n, Integer a,String c, Double s)
    {
        name = n;
        age = a;
        company = c;
        salary = s;
    }

    public String toString()
    {
        return "name:"+name+":age:"+age+":company:"+company+":salary:"+salary;
    }
}
}
//output
//_salalary defined_
//name:A:age:21:company:comp_A:salary:100.0
//name:A:age:21:company:comp_A:salary:100.0
//name:B:age:22:company:comp_B:salary:200.0
//name:C:age:23:company:comp_C:salary:300.0
//_unique by name,age,company_
//A:21:comp_A
//B:22:comp_B
//C:23:comp_C
//D:24:comp_D
//E:25:comp_E
//(first)key for search in initial list | name=A,age=21,company=comp_A

关于java - 查找应该为每一行的一个参数至少定义一个值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54278823/

相关文章:

java - ActionListener 中未初始化的变量

Java后缀Trie超出堆空间

java - 将数据存储在有效的数据结构中,以便快速搜索

python - 在图中实现(修改后的)DFS

java - Java 中的 ASCII 字符集

algorithm - 表示位置和基于接近度查询的有效方法?

java - 需要验证循环,二进制到十进制未输出正确的答案

java - 谷歌电子表格的 OAuth2 身份验证问题

java - 我没有使用 angularjs 将数据获取到我的 Restful Web 服务

Python 和 OpenCV - 改进我的车道检测算法