集合中的Java过滤

集合中的Java过滤,java,collections,Java,Collections,我有一个对象列表,如下所示 Emp e1 = new Emp(10,"Anitha",1000,"AE"); Emp e2 = new Emp(20,"Chaitanya",2000,"SE"); Emp e3 = new Emp(30,"Chaitanya",3000,"SE"); Emp e4 = new Emp(40,"Deepthi",2100,"AE"); Emp e5 = new Emp(50,"Deepthi",2200,"CE"); Emp e6 = new Emp(

我有一个对象列表,如下所示

Emp e1  = new Emp(10,"Anitha",1000,"AE");
Emp e2  = new Emp(20,"Chaitanya",2000,"SE");
Emp e3  = new Emp(30,"Chaitanya",3000,"SE");
Emp e4  = new Emp(40,"Deepthi",2100,"AE");
Emp e5  = new Emp(50,"Deepthi",2200,"CE");
Emp e6  = new Emp(60,"Deepthi",2300,"BE");
Emp e7  = new Emp(70,"Anitha",2300,"BE");
Emp e8  = new Emp(80,"Anitha",2400,"ME");
Emp e9  = new Emp(90,"Sita",2200,"CE");
Emp e10 = new Emp(100,"Hari",2200,"CE");
Emp e11 = new Emp(110,"Krishna",2200,"CE");
我想过滤唯一名称上的值,也要过滤相同名称上的值,如

1.关于唯一名称:输出应为

(50,"Deepthi",2200,"CE")
(100,"Hari",2200,"CE")
(110,"Krishna",2200,"CE")
并共用同一名称:

相似输出

(10,"Anitha",1000,"AE")
(70,"Anitha",2300,"BE")
(80,"Anitha",2400,"ME")
(20,"Chaitanya",2000,"SE");
(30,"Chaitanya",3000,"SE");
(40,"Deepthi",2100,"AE");
(50,"Deepthi",2200,"CE");
(60,"Deepthi",2300,"BE");
使用集合。。。。 有人能帮我吗

提前谢谢。
Nithya

这不是一个收藏,虽然它是传统意义上的“列表”,但它不是一个收藏

为此,您可以尝试:

ArrayList<Emp> employeeList = new ArrayList<Emp>();

employeeList.add(new Emp(10,"Anitha",1000,"AE"));
// repeat
ArrayList employeeList=new ArrayList();
新增(新Emp(10,“Anitha”,1000,“AE”);
//重复

如果您使用的是java 8,请跳到最后

我可能会创建一个新的方法来实现这一点,但您似乎是Java新手,所以我将描述更基本的方法

您应该首先创建一个list(),如下所示:

现在你可以开始过滤了

因此,假设在类
Emp
中有一个
getName()
方法,您可以编写如下函数:

// this function takes a list and a name, and filters the list by the name
public static List<Emp> filterEmpsByName(List<Emp> emps, String name){
    // a place to store the result
    List<Emp> result = new ArrayList<Emp>();
    // iterate over the list we got
    for (Emp emp: emps){
        // save only the elements we want
        if (emp.getName().equals(name)){
            result.add(emp);
        }
    }
    return result;
}
现在来看第二部分,这有点棘手:

// this function takes a list and a name, and filters the list by the name
public static List<Emp> getDistinctlyNamedEmps(List<Emp> emps, String name) {
    // this time we use a map which is A LOT faster for this kind of operation

    Map<String, Emp> result = new HashMap<String, Emp>();
    // iterate over the list we got
    for (Emp emp : emps) {
        // save only the elements we want
        if (result.get(emp.getName()) == null ) {
            result.put(emp.getName(), emp);
        }
    }

    // convert map to list - not mandatory if you can use the map as is...
    return new ArrayList<Emp>(result.values());
}
Java8:

Java8具有(匿名函数),这是许多其他语言中用于过滤和其他操作的整洁工具


您可以阅读更多有关使用它们的信息。

据我所知,到目前为止,答案都假定任务是搜索特定名称,或查找具有唯一名称的元素,我认为这不是要求的

为了按照原始问题中描述的方式过滤列表,可以创建从“键”(即本例中的“名称”)到共享此键的元素列表的映射。使用这张地图,你可以很容易地找到

  • 每个键一个元素,在所有元素中只出现一次
  • 具有在所有元素中至少出现两次键的所有元素的列表
这些任务非常相似,可能会有进一步的概括,但这里有一种方法可以实现这一点:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class CriterionFilter
{
    public static void main(String[] args)
    {
        List<Emp> list = new ArrayList<Emp>();
        list.add(new Emp(10,"Anitha",1000,"AE"));
        list.add(new Emp(20,"Chaitanya",2000,"SE"));
        list.add(new Emp(30,"Chaitanya",3000,"SE"));
        list.add(new Emp(40,"Deepthi",2100,"AE"));
        list.add(new Emp(50,"Deepthi",2200,"CE"));
        list.add(new Emp(60,"Deepthi",2300,"BE"));
        list.add(new Emp(70,"Anitha",2300,"BE"));
        list.add(new Emp(80,"Anitha",2400,"ME"));
        list.add(new Emp(90,"Sita",2200,"CE"));
        list.add(new Emp(100,"Hari",2200,"CE"));
        list.add(new Emp(110,"Krishna",2200,"CE"));

        Function<Emp, String> keyFunction = new Function<Emp, String>()
        {
            @Override
            public String apply(Emp s)
            {
                return s.getName();
            }
        };
        List<Emp> fiteredOnUnique = filterOnUnique(list, keyFunction);
        System.out.println("Filtered on unique:");
        print(fiteredOnUnique);

        List<Emp> filteredOnSame = filterOnSame(list, keyFunction);
        System.out.println("Filtered on same:");
        print(filteredOnSame);
    }

    private static void print(Iterable<?> elements)
    {
        for (Object element : elements)
        {
            System.out.println(element);
        }
    }

    /**
     * Create a map that maps the keys that are provided for the given
     * elements to the list of elements that have this key
     *
     * @param elements The input elements
     * @param keyFunction The key function
     * @return The map
     */
    private static <T, K> Map<K, List<T>> map(
        Iterable<? extends T> elements, Function<? super T, K> keyFunction)
    {
        Map<K, List<T>> map = new HashMap<K, List<T>>();
        for (T t : elements)
        {
            K key = keyFunction.apply(t);
            List<T> list = map.get(key);
            if (list == null)
            {
                list = new ArrayList<T>();
                map.put(key, list);
            }
            list.add(t);
        }
        return map;
    }

    /**
     * Uses the given key function to compute the keys associated with the
     * given elements, and returns a list containing the element of
     * the given sequence that have unique keys
     *
     * @param elements The input elements
     * @param keyFunction The key function
     * @return The filtered list
     */
    private static <T, K> List<T> filterOnUnique(
        Iterable<? extends T> elements, Function<? super T, K> keyFunction)
    {
        List<T> result = new ArrayList<T>();
        Map<K, List<T>> map = map(elements, keyFunction);
        for (Entry<K, List<T>> entry : map.entrySet())
        {
            List<T> list = entry.getValue();
            if (list.size() == 1)
            {
                result.add(list.get(0));
            }
        }
        return result;
    }

    /**
     * Uses the given key function to compute the keys associated with the
     * given elements, and returns a list containing all elements of
     * the given sequence that have a key that occurs multiple times.
     *
     * @param elements The input elements
     * @param keyFunction The key function
     * @return The filtered list
     */
    private static <T, K> List<T> filterOnSame(
        Iterable<? extends T> elements, Function<? super T, K> keyFunction)
    {
        List<T> result = new ArrayList<T>();
        Map<K, List<T>> map = map(elements, keyFunction);
        for (Entry<K, List<T>> entry : map.entrySet())
        {
            List<T> list = entry.getValue();
            if (list.size() > 1)
            {
                result.addAll(list);
            }
        }
        return result;
    }



    /**
     * Interface for a generic function
     */
    static interface Function<S, T>
    {
        T apply(S s);
    }

}


class Emp
{
    private int i;
    private String name;
    private int j;
    private String whatever;

    public Emp(int i, String name, int j, String whatever)
    {
        this.i = i;
        this.name = name;
        this.j = j;
        this.whatever = whatever;
    }

    @Override
    public String toString()
    {
        return "Emp [i=" + i + ", name=" + name + ", j=" + j + ", whatever=" + whatever + "]";
    }

    String getName()
    {
        return name;
    }
}
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
公共类标准过滤器
{
公共静态void main(字符串[]args)
{
列表=新的ArrayList();
增加(新的环境管理计划(10,“Anitha”,1000,“AE”);
增加(新的环境管理计划(20,“柴坦尼亚”,2000年,“东南”);
增加(新环境管理计划(30,“柴坦尼亚”,3000,“东南”);
增加(新的环境管理计划(40,“Deepthi”,2100,“AE”);
增加(新的环境管理计划(50,“Deepthi”,2200,“CE”);
增加(新的环境管理计划(60,“Deepthi”,2300,“BE”);
增加(新的环境管理计划(70,“安妮莎”,2300,“BE”);
增加(新的环境管理计划(80,“安妮莎”,2400,“我”);
增加(新的环境管理计划(90,“Sita”,2200,“CE”);
增加(新的环境管理计划(100,“哈里”,2200,“行政长官”);
增加(新Emp(110,“克里希纳”,2200,“CE”);
函数keyFunction=新函数()
{
@凌驾
公共字符串应用(Emp s)
{
返回s.getName();
}
};
List fiteredOnUnique=filterOnUnique(列表,键函数);
System.out.println(“根据唯一性进行过滤:”;
打印(fiteredOnUnique);
List filteredOnSame=filterOnSame(列表,键函数);
System.out.println(“在相同条件下过滤”);
打印(过滤相同);
}
专用静态空白打印(可编辑元素)
{
for(对象元素:元素)
{
系统输出打印项次(元素);
}
}
/**
*创建映射为给定对象提供的键的映射
*元素添加到具有此键的元素列表中
*
*@param元素输入元素
*@param keyFunction键函数
*@归还地图
*/
私有静态映射(

IterableI没有看到列表。请告诉我们您尝试了什么。您确定这是唯一名称的正确值吗?Sita、Hari和Krishna是唯一只有一个值的员工名称。标准Java API中没有内置任何内容。请阅读apache commons collections中的Filtererator:Guava也有一个,但我不记得名称。对吗假设第一个输出不应该包含
(50,“Deepthi”,2200,“CE”)
,而是应该包含
(90,“Sita”,2200,“CE”)
(因为“Sita”这个名字只出现一次)?这不是答案,这是一个注释只回答了一半的问题感谢您的洞察力,我将添加更多细节
// print to standard output the result of our function on the "main" list `emp` with name "Anitha"
for (Emp emp : filterEmpsByName(emps, "Anitha")){
    System.out.println(emp.toString()); // make sure toString() is overridden in Emp class
}
// this function takes a list and a name, and filters the list by the name
public static List<Emp> getDistinctlyNamedEmps(List<Emp> emps, String name) {
    // this time we use a map which is A LOT faster for this kind of operation

    Map<String, Emp> result = new HashMap<String, Emp>();
    // iterate over the list we got
    for (Emp emp : emps) {
        // save only the elements we want
        if (result.get(emp.getName()) == null ) {
            result.put(emp.getName(), emp);
        }
    }

    // convert map to list - not mandatory if you can use the map as is...
    return new ArrayList<Emp>(result.values());
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        // create an [arraylist][4] (list based on an array)
        List<Emp> emps = new ArrayList<Emp>();

        emps.add(new Emp(10, "Anitha", 1000, "AE"));
        emps.add(new Emp(20, "Chaitanya", 2000, "SE"));

        // print to standard output the result of our function on the "main"
        // list `emp` with name "Anitha"
        System.out.println("filterEmpsByName(emps, \"Anitha\") output:");
        for (Emp emp : filterEmpsByName(emps, "Anitha")) {
            System.out.println(emp.toString()); // make sure toString() is
                                                // overridden in Emp class
        }

        // print to standard output the result of our second function on the "main"
        // list `emp`
        System.out.println("getDistinctlyNamedEmps(emps) output:");
        for (Emp emp : getDistinctlyNamedEmps(emps)) {
            System.out.println(emp.toString()); // make sure toString() is
                                                // overridden in Emp class
        }
    }

    // this function takes a list and a name, and filters the list by the name
    public static List<Emp> filterEmpsByName(List<Emp> emps, String name) {
        // a place to store the result
        List<Emp> result = new ArrayList<Emp>();
        // iterate over the list we got
        for (Emp emp : emps) {
            // save only the elements we want
            if (emp.getName().equals(name)) {
                result.add(emp);
            }
        }
        return result;
    }

    // this function takes a list and a name, and filters the list by the name
    public static List<Emp> getDistinctlyNamedEmps(List<Emp> emps) {
        // this time we use a map which is A LOT faster for this kind of
        // operation

        Map<String, Emp> result = new HashMap<String, Emp>();
        // iterate over the list we got
        for (Emp emp : emps) {
            // save only the elements we want
            if (result.get(emp.getName()) == null) {
                result.put(emp.getName(), emp);
            }
        }

        // convert map to list - not necessary
        return new ArrayList<Emp>(result.values());
    }

}
public class Emp {

    private String name;

    public Emp(int stubi, String name, int j, String stubs) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public String toString() {
        return "[" + this.name + "]";
    }
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class CriterionFilter
{
    public static void main(String[] args)
    {
        List<Emp> list = new ArrayList<Emp>();
        list.add(new Emp(10,"Anitha",1000,"AE"));
        list.add(new Emp(20,"Chaitanya",2000,"SE"));
        list.add(new Emp(30,"Chaitanya",3000,"SE"));
        list.add(new Emp(40,"Deepthi",2100,"AE"));
        list.add(new Emp(50,"Deepthi",2200,"CE"));
        list.add(new Emp(60,"Deepthi",2300,"BE"));
        list.add(new Emp(70,"Anitha",2300,"BE"));
        list.add(new Emp(80,"Anitha",2400,"ME"));
        list.add(new Emp(90,"Sita",2200,"CE"));
        list.add(new Emp(100,"Hari",2200,"CE"));
        list.add(new Emp(110,"Krishna",2200,"CE"));

        Function<Emp, String> keyFunction = new Function<Emp, String>()
        {
            @Override
            public String apply(Emp s)
            {
                return s.getName();
            }
        };
        List<Emp> fiteredOnUnique = filterOnUnique(list, keyFunction);
        System.out.println("Filtered on unique:");
        print(fiteredOnUnique);

        List<Emp> filteredOnSame = filterOnSame(list, keyFunction);
        System.out.println("Filtered on same:");
        print(filteredOnSame);
    }

    private static void print(Iterable<?> elements)
    {
        for (Object element : elements)
        {
            System.out.println(element);
        }
    }

    /**
     * Create a map that maps the keys that are provided for the given
     * elements to the list of elements that have this key
     *
     * @param elements The input elements
     * @param keyFunction The key function
     * @return The map
     */
    private static <T, K> Map<K, List<T>> map(
        Iterable<? extends T> elements, Function<? super T, K> keyFunction)
    {
        Map<K, List<T>> map = new HashMap<K, List<T>>();
        for (T t : elements)
        {
            K key = keyFunction.apply(t);
            List<T> list = map.get(key);
            if (list == null)
            {
                list = new ArrayList<T>();
                map.put(key, list);
            }
            list.add(t);
        }
        return map;
    }

    /**
     * Uses the given key function to compute the keys associated with the
     * given elements, and returns a list containing the element of
     * the given sequence that have unique keys
     *
     * @param elements The input elements
     * @param keyFunction The key function
     * @return The filtered list
     */
    private static <T, K> List<T> filterOnUnique(
        Iterable<? extends T> elements, Function<? super T, K> keyFunction)
    {
        List<T> result = new ArrayList<T>();
        Map<K, List<T>> map = map(elements, keyFunction);
        for (Entry<K, List<T>> entry : map.entrySet())
        {
            List<T> list = entry.getValue();
            if (list.size() == 1)
            {
                result.add(list.get(0));
            }
        }
        return result;
    }

    /**
     * Uses the given key function to compute the keys associated with the
     * given elements, and returns a list containing all elements of
     * the given sequence that have a key that occurs multiple times.
     *
     * @param elements The input elements
     * @param keyFunction The key function
     * @return The filtered list
     */
    private static <T, K> List<T> filterOnSame(
        Iterable<? extends T> elements, Function<? super T, K> keyFunction)
    {
        List<T> result = new ArrayList<T>();
        Map<K, List<T>> map = map(elements, keyFunction);
        for (Entry<K, List<T>> entry : map.entrySet())
        {
            List<T> list = entry.getValue();
            if (list.size() > 1)
            {
                result.addAll(list);
            }
        }
        return result;
    }



    /**
     * Interface for a generic function
     */
    static interface Function<S, T>
    {
        T apply(S s);
    }

}


class Emp
{
    private int i;
    private String name;
    private int j;
    private String whatever;

    public Emp(int i, String name, int j, String whatever)
    {
        this.i = i;
        this.name = name;
        this.j = j;
        this.whatever = whatever;
    }

    @Override
    public String toString()
    {
        return "Emp [i=" + i + ", name=" + name + ", j=" + j + ", whatever=" + whatever + "]";
    }

    String getName()
    {
        return name;
    }
}