1

我有两个列表,其中匹配索引的列表之间的项目是链接的。第一个列表提供与第二个列表值相关的键:

List<Double> a1 = [10,20,20,30,10];           // keys
List<Double> y1 = [2012,2013,2012,2012,2013]; // values

我想从键(索引)列表中删除重复项,以便在找到重复项时添加键的值。因此,例如,如果找到两个值为 10 的键,我想用一个值为 20 的键替换这两个键。将重复此过程,直到没有剩余的重复键。所以我想要这样的列表输出:

List<Double> a1 = [60,30];
List<Double> y1 = [2012,2013];

我尝试使用以下代码解决此问题,但输出不正确。

y2=new ArrayList<Double>();
a2 = new ArrayList<Double>();
String y = "";
double a = 0;

for (int i = 0; i < y1.size(); i++) {

    if (y1.get(i).equals(y)) {
        a = a + y1.get(i);
    } else {
        if (!y.equals("")) {
            y2.add(y);
            a2.add(a);
        }

        y = y1.get(i);
        a = a1.get(i);
    }
}

y2.add(y);
a2.add(a);

任何帮助表示赞赏,谢谢。

4

3 回答 3

6

用一个Map

Map<Double, Double> map = new HashMap<>();
for (int i = 0; i < y1.size(); i++) {
    double oldValue = map.containsKey(y1.get(i)) ? map.get(y1.get(i)) : 0.0;

    map.put(y1.get(i), oldValue + a1.get(i));
}

y1.clear();
a1.clear();

for (Entry<Double, Double> entry : map.entrySet()) {
    y1.add(entry.getKey());
    a1.add(entry.getValue());
}
于 2013-04-08T10:15:25.837 回答
0
private void method(List<Double> y1, List<Double> a1) {
    for (int i = 0; i < y1.size(); i++) {
        if (y1.get(i) != -1) {
        for (int j = i + 1; j < y1.size(); j++) {
            if (y1.get(i).equals(y1.get(j))) {
            y1.set(j, -1d);
            a1.set(i, a1.get(i) + a1.get(j));
            a1.set(j, -1d);
            }
        }
        }
    }
    for (Iterator<Double> itr = y1.iterator(); itr.hasNext();)
        if (itr.next().equals(-1d))
        itr.remove();
    for (Iterator<Double> itr = a1.iterator(); itr.hasNext();)
        if (itr.next().equals(-1d))
        itr.remove();
    }
于 2013-04-08T10:45:37.487 回答
0

您的代码失败,因为 y1 数组未排序。由于您想保留 y1 和 a1 之间的映射,您应该使用此值创建一个类,并创建一个此类的数组:

public class Elem implements Comparable<Elem> 
{
    double year;
    double value;

// getters and setters 

public double getValue() {
    return value;
}

public void setValue(double value) {
    this.value = value;
}


public int compareTo(Elem item) 
    {
        if (this.getYear() == item.getYear())
        return 0;
    else if (this.getYear() > item.getYear())
        return 1;
    else 
        return -1;
}

public int hashCode()
{
    StringBuffer buffer = new StringBuffer();
    buffer.append(this.year);
    buffer.append(this.value);
    return buffer.toString().hashCode();
}

public boolean equals(Object item)
{
    if (item instanceof Elem)
    {
        Elem e = (Elem) item;
        if (e.getYear() == this.getYear())
        {
            return true;
        }
        return false;
    }
    return false;
}
}

现在您可以创建数组、填充和排序它:

    List<Elem> y1 = new ArrayList<Elem>();

    //---- populate array ----

    Collections.sort(y1);

    ArrayList<Elem> y2;

    y2 = new ArrayList<Elem>();
    Elem y = null;

    double a = 0;

    for(int i = 0;i<y1.size();i++){
        if((y != null) && (y1.get(i).equals(y))){
            a = y.getValue() + y1.get(i).getValue();
            y1.get(i).setValue(a);
            y = y1.get(i);
        }
        else{
            if(y != null) {
                y2.add(y);
            }

            y = y1.get(i);
        }


    }
    if(y != null) {
        y2.add(y);
    }
于 2013-04-08T11:11:32.920 回答