我有一种从作为员工信息的对象集合中提取值的方法:
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");
然后我想以不同的方式做它,看它是否变得更快,排序数组然后只检查最后一项如果它不同然后添加它,它更快一点,它需要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");
我是Java新手我想知道更好的方法。 *注意,此代码应该适用于android gingerbread API LVL 10 问候。
答案 0 :(得分:10)
如果要获取或统计员工列表中的不同区域,可以使用一组字符串。我正在更改变量名称以匹配Java标准。你可以事后得到计数。理想情况下,这些都是懒惰的方法。
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()));
}
答案 1 :(得分:2)
将所有员工插入HashSet
。从Set
的定义来看,它们都是独一无二的。
Set<Employee> unique = new HashSet<Employee>(Arrays.asList(employeeTress));
// unique.toArray() if needed
如果您希望Employee
个对象在具有相同AREA
时被视为相等,则需要properly覆盖equals()
类中的Employee
方法
答案 2 :(得分:2)
您可以使用Set
执行此操作,正如其他人已经说过的那样,但是如果您希望项目在具有相同AREA
时被视为相等,则您需要覆盖{ {1}}对象中的{1}}方法,根据该变量将其与其他对象进行比较。
在重写equals方法之前,您需要了解一些事情。这里有一个讨论: What issues should be considered when overriding equals and hashCode in Java?
答案 3 :(得分:1)
只需使用HashSet,它将仅向HashSet添加唯一元素。
HashSet的objectOfHashSet.add(Object)
函数将返回true on successful
对象的添加,
Set<Employee> hs = new HashSet<Employee>();
if(!hs.add(i2)){
// do some operation here
}
您还需要覆盖此处的equals method
。
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!(obj instanceof Employee))
return false;
// HERE PERFORM YOUR CHECK
if("Employee.NAME".isequals(obj.NAME))
{return true;}
}
还要确保在对象位于集合中时,放入集合的hashCode() of the key objects
永远不会更改。确保这一点的最佳方法是制作keys immutable
。