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()));
}