Java:从现有List创建唯一List,保持索引号不变

时间:2016-05-23 11:59:44

标签: java arrays list

我有两个ArrayLists。

  1. 日期列表
  2. 各个数据的列表。
  3. 两者都是同步。我有时在同一日期有多个数据。我需要创建两个列表:唯一日期和数据(平均值)。到目前为止,我已经尝试了以下方法

    int i = 1;
    for(int it =0; it < predatetime.size() - 1; it++){
       //Compare each element with the next one
        if(predatetime.get(it+1) == predatetime.get(it)){
            i++;
            weight = preweight.get(it+1) + weight;
            //If equal, add weights and increment a divisor for averaging
        } 
        else {    //if not equal, add to the new lists
            if(it == predatetime.size() - 2){  //if the last element is not equal to its previous one, just add it to the list
                newDateTime.add(predatetime.get(it+1));
                newWeight.add(preweight.get(it+1));
                break;
            }
            weight = weight / i;
            newDateTime.add(predatetime.get(it));
            newWeight.add(weight);
    
            weight = preweight.get(it+1);    //re-initialize variables
            i = 1;
        }
        if(it == predatetime.size() - 2){
            weight = weight / i;
            newDateTime.add(predatetime.get(it));
            newWeight.add(weight);
        }
    }
    

    此代码存在很多问题。

    如果列表只有一个元素,则失败。 (我知道我可以再写两行来照顾这个)。有更好的方法吗?

    我知道这个网站上有类似的问题,但我仍然无法解决问题。

4 个答案:

答案 0 :(得分:0)

如果您尝试使列表元素唯一,为什么不尝试将列表转换为集合集

Set<Foo> foo = new HashSet<Foo>(myList);

答案 1 :(得分:0)

为什么不以日期作为键创建地图,并将值作为列表。这样您就可以保持日期的唯一性,同时允许您将数据作为列表。

Map<String, ArrayList<myData>> myMap = new HashMap<String, ArrayList<myData>>();

然后你可以找到你的密钥是否存在,如果它确实通过使用密钥将其添加到数组列表来识别正确的列表。如果它不存在,请将其添加到地图

答案 2 :(得分:0)

感谢@Rambler和@JulianGurung,我创建了一个HashMap并且它可以工作

        HashMap<Integer, Float> hm = new HashMap<Integer,Float>();  
        int occurance = 0;
        float weight = 0;
        hm.put(predatetime.get(0), 0f); //initialize with the first value

        for(Map.Entry m : hm.entrySet()){  
            for( int it = 0; it < predatetime.size(); it++){
                if(m.getKey() == predatetime.get(it)){
                    weight = (Float) m.getValue() + preweight.get(it);  //Sum all the same data in order to avg later
                    hm.put(predatetime.get(it), weight);
                    occurance++;
                }
                else{   //if it is not equal, add the new element to the map
                    hm.put(predatetime.get(it), preweight.get(it));
                }
            }
            weight = weight / occurance;
            hm.put((Integer) m.getKey(), weight);
            weight = 0;
            occurance = 0;
        }

答案 3 :(得分:0)

这是完整的解决方案

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;

public class CustomList {

public static void main(String[] args) {

    ArrayList<String> date = new ArrayList<>();
    date.add("1");
    date.add("2");
    date.add("2");
    date.add("3");
    System.out.println(date);

    ArrayList<Integer> value = new ArrayList<>();
    value.add(1);
    value.add(2);
    value.add(4);
    value.add(3);
    System.out.println(value);

    new MyCls().createList(date, value);

}

}

类MyCls {

ArrayList uniqueDate = new ArrayList<String>();
ArrayList averageValue = new ArrayList<Integer>();
LinkedHashMap store = new LinkedHashMap<String, CountEntry>();

class CountEntry {
    int value;
    int count;

    CountEntry() {
    }

    CountEntry(int v, int c) {
        value = v;
        count = c;
    }

    public int getValue() {
        return value;
    }

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

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

public void createList(ArrayList<String> date, ArrayList<Integer> value) {
    for (int i = 0; i < date.size(); i++) {
        CountEntry tmp = (CountEntry) store.get(date.get(i));

        if (tmp == null) {
            store.put(date.get(i), new CountEntry(value.get(i), 1));
        } else {
            int tmpVal = tmp.getValue();
            int tmpCount = tmp.getCount();
            store.put(date.get(i), new CountEntry(value.get(i) + tmpVal, ++tmpCount));
        }
    }

    ArrayList<String> uniqueDate = new ArrayList<String>(store.keySet());
    ArrayList<CountEntry> tempAvgList = new ArrayList<CountEntry>(store.values());

    for (CountEntry ce : tempAvgList) {

        averageValue.add(ce.getValue() / ce.getCount());

    }
    System.out.println("Output");
    System.out.println(uniqueDate);
    System.out.println(averageValue);
}

} / *

OUTPUT Snap:

[1, 2, 2, 3]
[1, 2, 4, 3]
Output
[1, 2, 3]
[1, 3, 3]

* /

相关问题