使用 HashMap(或 Map 接口的任何其他实现)来有效地解决您的问题(@kai 解决方案是可以的,但它是 O(N^2))。这个例子不是通用的,它只有在网格(数据矩阵)的第二列中有两个可能的值(延迟和反弹)时才有效。解决方案以这种方式工作:我们遍历数据矩阵中的行并检查当前实体(按名称表示 - 网格的第一列)是否已经在 hashmap 中。如果是,只需增加该实体百分比(实体类的inc方法),否则我们必须首先创建实体的新实例,将其添加到hashmap然后增加百分比。打印是类似的(因为我们需要以它们在矩阵中出现的相同顺序打印名称):我们再次迭代数据并打印实体对象(这就是 toString 方法被覆盖的原因)。
import java.util.HashMap;
public class HelloWorld{
static class Entity {
private String name;
private int countFirst;
private int countSecond;
private boolean isVisitedMember; // because we want to print in same order as in original matrix
public Entity(String name) {
this.name = name;
countFirst = 0;
countSecond = 0;
isVisitedMember = false;
}
public void inc(String status) {
if (status.toLowerCase().equals("deferred")) {
++countFirst;
}
else {
++countSecond;
}
}
public boolean isVisited() {
return isVisitedMember;
}
public void setIsVisited(boolean value) {
isVisitedMember = value;
}
public float getFirstPercent() {
return (float)countFirst / (countFirst + countSecond) * 100;
}
public float getSecondPercent() {
return (float)countSecond / (countFirst + countSecond) * 100;
}
@Override
public String toString() {
if (countFirst <= countSecond) {
int first = (int)Math.ceil(getFirstPercent());
return String.format("%s --> Deferred %d %% , Bounced %d %%", name, first, 100 - first);
}
int second = (int)Math.ceil(getSecondPercent());
return String.format("%s --> Deferred %d %% , Bounced %d %%", name, 100 - second, second);
}
}
public static void main(String []args){
String[][] data = {
{ "FAI", "deferred" },
{ "SDE", "Bounced" },
{ "FAI", "Bounced" },
{ "SDE", "Bounced" },
{ "SDE", "deferred" },
{ "FAI", "deferred" },
};
HashMap<String, Entity> map = new HashMap<String, Entity>();
for (int i = 0; i < data.length; ++i) {
String name = data[i][0];
String value = data[i][1];
Entity entity = map.get(name);
if (entity == null) {
entity = new HelloWorld.Entity(name);
map.put(name, entity);
}
entity.inc(value);
}
// print in same order as in original matrix
for (int i = 0; i < data.length; ++i) {
String name = data[i][0];
Entity entity = map.get(name);
if (entity.isVisited()) {
continue;
}
entity.setIsVisited(true);
System.out.println(entity);
}
}
}