Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有更快的方法从对象集合中提取唯一值?_Java_Collections - Fatal编程技术网

Java 有没有更快的方法从对象集合中提取唯一值?

Java 有没有更快的方法从对象集合中提取唯一值?,java,collections,Java,Collections,我有一种方法可以从作为员工信息的对象集合中提取值: public class Employee { public String AREA; public String EMPLOYEE_ID; public String EMPLOYEE_NAME; } 我想得到我所做的所有不同的区域,我认为这会更容易,只要检查ArrayList是否包含值,如果没有添加值,则需要187ms才能完成: long startTime = System.currentTimeMill

我有一种方法可以从作为员工信息的对象集合中提取值:

public class Employee
{
    public String AREA;
    public String EMPLOYEE_ID;
    public String EMPLOYEE_NAME;
}
我想得到我所做的所有不同的区域,我认为这会更容易,只要检查ArrayList是否包含值,如果没有添加值,则需要187ms才能完成:

    long startTime = System.currentTimeMillis();
    ArrayList<String> distinct_areas = new ArrayList<String>();
    for (int i = 0; i < this.employeeTress.length; i++)
    {
        if (!distinct_areas.contains(this.employeeTress[i].AREA))
            distinct_areas.add(this.employeeTress[i].AREA);
    }
    String[] unique = new String[distinct_areas.size()];
    distinct_areas.toArray(unique);
    long endTime = System.currentTimeMillis();
    System.out.println("Total execution time: " + (endTime - startTime) + "ms");
long startTime=System.currentTimeMillis();
ArrayList distinct_areas=新的ArrayList();
for(int i=0;i
然后我想用不同的方法来看看它是否更快,对数组进行排序,然后只检查最后一个项目,如果它不同,然后添加它,速度稍微快一点,需要121ms才能完成:

    startTime = System.currentTimeMillis();
    String[] vs = new String[this.employeeTress.length];
    for (int i = 0; i < this.employeeTress.length; i++)
    {
        vs[i] = this.employeeTress[i].AREA;
    }
    Arrays.sort(vs);
    ArrayList<String> vsunique = new ArrayList<String>();
    vsunique.add(vs[0]);
    for (int i = 0; i < vs.length; i++)
    {
        if (!vsunique.get(vsunique.size()-1).equals(vs[i]))
        {
            vsunique.add(vs[i]);
        }
    }
    String[] uni = new String[vsunique.size()];
    vsunique.toArray(uni);
    endTime = System.currentTimeMillis();
    System.out.println("Total execution time: " + (endTime - startTime) + "ms");
startTime=System.currentTimeMillis();
String[]vs=新字符串[this.employeeTress.length];
for(int i=0;i
我是Java新手,我想知道一种更好的方法。 *注意,这段代码应该在AndroidGingerbreadAPIl10中工作
注意。

只需使用HashSet,它将只向HashSet添加唯一的元素

HashSet.add(Object)
函数的
objectOfHashSet.add(Object)
在成功添加对象时将返回
true

Set<Employee> hs = new HashSet<Employee>();

    if(!hs.add(i2)){
      // do some operation here
    }

还要确保在对象位于集合中时,放入集合中的关键对象的
hashCode()不会更改。确保这一点的最佳方法是使您的
键不可变

将所有员工插入
哈希集
。从
集合的定义来看,它们都是唯一的

Set<Employee> unique = new HashSet<Employee>(Arrays.asList(employeeTress));
// unique.toArray() if needed
Set unique=newhashset(Arrays.asList(employeeTress));
//如果需要,则为unique.toArray()

如果您希望
Employee
对象在具有相同的
区域时被视为相等,则需要重写
Employee
类中的
equals()
方法。

您可以使用
来执行此操作,其他人已经说过,但是,如果您希望项目在具有相同的
区域时被视为相等,则需要重写
Employee
对象中的
equals
方法,使其基于该变量将自身与其他对象进行比较

在跳过equals方法之前,您需要知道一些事情。这里有一个关于它的讨论:

如果要获取或统计员工列表中的不同区域,可以使用一组字符串。我正在更改变量名以匹配Java标准。你可以在事后数一数。理想情况下,这些将是懒惰的方法

命令式代码
公共设置区域(最终员工名单){
Set areas=新HashSet();
对于(最终员工:员工){
add(employee.getArea());
}
返回区;
}
功能代码(谷歌番石榴)
公共设置区域(最终员工名单){
return Sets.newHashSet(
Lists.transform(员工,新功能(){
公共字符串应用(员工e){
返回e.getArea();
}
}));
}
Lambdas(Java 8)
公共设置区域(最终员工名单){
返回新的HashSet(employees.map(e=>e.getArea());
}

使用
集合
而不是
列表
。也,我不会担心这种性能的提高,直到它被证明是应用程序中的一个真正瓶颈。Java中应该全部使用CAP的唯一类型是
final static
primitives或
enum
s.@Dukeling,其中包括Java语言本身的名称:))对不起,该类是一个副本的所有CAPS字段从提取表单粘贴一个json结构,其中所有caps字段都来自ORM,并从Oracle数据库自动创建表,换句话说,我没有键入它们。如果这是一个ORM,你不能通过ORM做些什么来获取不同的区域吗?事实上,
Set
应该用来保存
Employee
数据,而不是使用当前数组OP。使用HashSet的命令式表单比检查项是否已在集合中快得多。谢谢。那是因为JRE也在做同样的事情。其他版本只是删除显式循环。他们不会给你买那么多,因为这不是一个懒惰的问题;你需要计算整个过程。不过,您应该考虑其他方法来存储数据。关系数据库可以存储您的员工,通过适当的索引,数据库可以非常快速地工作。我确实修正了一个打字错误。
Set<Employee> unique = new HashSet<Employee>(Arrays.asList(employeeTress));
// unique.toArray() if needed
public Set<String> areas(final List<Employee> employees) {
    Set<String> areas = new HashSet<>();
    for(final Employee employee: employees) {
        areas.add(employee.getArea());
    }
    return areas;
}
public Set<String> areas(final List<Employee> employees) {
    return Sets.newHashSet(
        Lists.transform(employees, new Function<Employee, String>() {
            public String apply(Employee e) {
                return e.getArea();
            }
        }));
}
public Set<String> areas(final List<Employee> employees) {
    return new HashSet<String>(employees.map(e => e.getArea()));
}