比较单个arraylist中的值,并使用java为其分配新值

时间:2014-09-24 20:32:36

标签: java list arraylist

我想比较同一个列表中的元素。如果元素不等于增量计数器,如果它们相等,则计数器保持不变。我有一些问题,让这个正确。 我的列表看起来像这样(这些只是用于测试的值):

List<Double> sample = new ArrayList<Double>();
        sample.add(110.00);
        sample.add(90.00);
        sample.add(90.00);
        sample.add(20.00);
        sample.add(20.00);

我需要得到结果

[1, 2, 2, 3, 3]. 

这是我到目前为止所做的,我尝试了两种不同的方法。

Double count = 1.0;
        for(int i = 0; i  < sample.size()-1; i++)
        {
            Double first = sample.get(i);
            Double second = sample.get(i+1);

            if(first.equals(second))
            {
                sample.set(i, count);
            }
            else
            {
                sample.set(i, count++);
            }

        }

打印:

[1.0, 2.0, 2.0, 3.0, 20.0] 

我不确定如何比较最后一双。我知道我没有检查列表的大小,因为我有size() - 1但我会得到索引超出范围的异常。 第二种方法是:

for (int i = 0; i < sample.size()-1; i++) 
        {
           for(int j=i+1; j < sample.size(); j++)
            {
                if(sample.get(i)==sample.get(j))
                {

                    sample.set(i, count);
                }
                else
                {

                    sample.set(i, count++);

                }
        }
        }

这将打印:

[6.0, 8.0, 10.0, 11.0, 20.0]

我知道我循环了两次,但可以找出调整的位置。

3 个答案:

答案 0 :(得分:0)

每个count需要一个Double

使用Map

Map<Double, Integer> doubleCount = new HashMap<>();
for (double d : sample) {
    Integer count = doubleCount.get(d);
    if(count == null) {
        doubleCount.put(d, 1);
    } else {
        doubleCount.put(d, count + 1);
    }
}

// to array
int[] res = new int[sample.size()];
int i = 0;
for(int d : sample) {
    res[i++] = doubleCount.get(d);
}

答案 1 :(得分:0)

Double count = 1.0;
        for(int i = 0; i  < sample.size()-1; i++)
        {
            Double first = sample.get(i);
            Double second = sample.get(i+1);

            if(first.equals(second))
            {
                sample.set(i, count);
                if((i + 2) == sample.size())
                {
                   sample.set((i+1), count);
                }
            }
            else
            {
                sample.set(i, ++count);
                if((i + 2) == sample.size())
                {
                   sample.set((i+1), count);
                }
            }

        }

试试这个。

答案 2 :(得分:0)

在你的第一个例子中,你必须处理最后两个元素 - 试试这个:

    Double count = 1.0;
    for(int i = 0; i  < sample.size()-1; i++) {
        Double first = sample.get(i);
        Double second = sample.get(i+1);

        if(first.equals(second)) {
            sample.set(i, count++);

            if(i==(sample.size()-2)) {
                sample.set(i, count);
                sample.set((i+1), count);
            } else {
                sample.set(i, count);
            }
        } else {
            sample.set(i, count);

            if(i==(sample.size()-2)) 
                sample.set((i+1), count);
            else 
                sample.set(i, count);
        }
    }