Java 获取同一字符串组中ArrayList中的双值之和

Java 获取同一字符串组中ArrayList中的双值之和,java,arraylist,Java,Arraylist,我有一个ArrayList,它有两个字符串值和一个双精度值。我想对相同字符串组中的双精度值求和。然后将它们分配到一个新列表 public class DashboardOneData { private String diviName; private double fullHours; private String mLevel; public DashboardOneData(String x, double y, String z){ this.divi

我有一个ArrayList,它有两个字符串值和一个双精度值。我想对相同字符串组中的双精度值求和。然后将它们分配到一个新列表

public class DashboardOneData {

    private String diviName;
    private double fullHours;
    private String mLevel;

public DashboardOneData(String x, double y, String z){
    this.diviName= z;
    this.fullHours= y;
    this.mLevel= y;
  }

}
这是一个示例ArrayList…..

List<DashboardOneData > items = new ArrayList<DashboardOneData >();
items.add(new DashboardOneData ("A", 1.11 , "x"));
items.add(new DashboardOneData ("A", 1.52 , "x"));
items.add(new DashboardOneData ("B", 2.22 , "m"));
items.add(new DashboardOneData ("A", 3.12 , "m"));
items.add(new DashboardOneData ("B", 2.52 , "m"));
items.add(new DashboardOneData ("C", 2.85 , "y"));
items.add(new DashboardOneData ("A", 2.22 , "y"));
items.add(new DashboardOneData ("A", 3.12 , "y"));
items.add(new DashboardOneData ("B", 1.01 , "m"));
items.add(new DashboardOneData ("C", 2.85 , "y"));

您可以使用
映射
来收集
仪表板数据
实例,这些实例具有相同的
diviName
mLevel

例如:

Map<String,DashboardOneData>
    map = items.stream()
               .collect(Collectors.toMap(d -> d.getDiviName() + "-" + d.getLevel(),
                                         Function.identity(),
                                         (d1,d2) -> new DashboardOneData (d1.getDiviName(),d1.getHours()+d2.getHours(),d1.getLevel())));

您可以使用Set它是一个不能包含重复元素的集合。它对数学集合抽象进行建模

请尝试以下代码:

Set<DashboardOneData> newItems = new HashSet<DashboardOneData>();

for (DashboardOneData dashboardOneData : items) {
int double sum =0;
 for (int i = 0; i < items.size(); i++) {
    if(dashboardOneData.diviName.equals(items.get(i).diviName) && dashboardOneData.mLevel.equals(items.get(i).mLevel) ){
    sum=sum+dashboardOneData.fullHours;
    if(i==items.size()-1){
        newItems.add(dashboardOneData);
     }
    }
}
}
Set newItems=newhashset();
用于(DashboardOneData DashboardOneData:项){
整数双和=0;
对于(int i=0;i
使用地图的最佳位置

class DashboardOneData {
    private String diviName;
    private double fullHours;
    private String mLevel;
    public String getDiviName() {
        return diviName;
    }
    public void setDiviName(String diviName) {
        this.diviName = diviName;
    }
    public double getFullHours() {
        return fullHours;
    }
    public void setFullHours(double fullHours) {
        this.fullHours = fullHours;
    }
    public String getmLevel() {
        return mLevel;
    }
    public void setmLevel(String mLevel) {
        this.mLevel = mLevel;
    }
    public DashboardOneData(String diviName, double fullHours, String mLevel) {
        super();
        this.diviName = diviName;
        this.fullHours = fullHours;
        this.mLevel = mLevel;
    }
}

public class AddListItemsBasedOnAttributes {

    public static void main(String[] args) {
        Map<String, Double> sumMap = new TreeMap<String, Double>();

        List<DashboardOneData> items = new ArrayList<DashboardOneData >();
        items.add(new DashboardOneData ("A", 1.11 , "x"));
        items.add(new DashboardOneData ("A", 1.52 , "x"));
        items.add(new DashboardOneData ("B", 2.22 , "m"));
        items.add(new DashboardOneData ("A", 3.12 , "m"));
        items.add(new DashboardOneData ("B", 2.52 , "m"));
        items.add(new DashboardOneData ("C", 2.85 , "y"));
        items.add(new DashboardOneData ("A", 2.22 , "y"));
        items.add(new DashboardOneData ("A", 3.12 , "y"));
        items.add(new DashboardOneData ("B", 1.01 , "m"));
        items.add(new DashboardOneData ("C", 2.85 , "y"));

        Iterator<DashboardOneData> it = items.iterator();
        while(it.hasNext()) {
            DashboardOneData dashboardOneData = it.next();
            String key = dashboardOneData.getDiviName() + "-" + dashboardOneData.getmLevel();
            if(sumMap.containsKey(key)) {
                double sum = sumMap.get(key);
                sum += dashboardOneData.getFullHours();
                sumMap.put(key, sum);
            }
            else {
                sumMap.put(key, dashboardOneData.getFullHours());
            }
        }
        System.out.println(sumMap);
    }   
}
class DashboardOneData{
私有字符串名称;
私人双倍全时;
私有字符串mLevel;
公共字符串getDiviName(){
返回diviName;
}
公共void setDiviName(字符串diviName){
this.diviName=diviName;
}
公共双倍getFullHours(){
全天返回;
}
公共无效设置完整小时数(双倍完整小时数){
this.fullHours=fullHours;
}
公共字符串getmLevel(){
返回mLevel;
}
公共void setmLevel(字符串mLevel){
this.mLevel=mLevel;
}
公共DashboardOneData(字符串diviName、双整小时、字符串mLevel){
超级();
this.diviName=diviName;
this.fullHours=fullHours;
this.mLevel=mLevel;
}
}
公共类AddListItemsBaseDonAttribute{
公共静态void main(字符串[]args){
Map sumMap=newtreemap();
列表项=新建ArrayList();
添加(新DashboardOneData(“A”,1.11,“x”));
添加(新DashboardOneData(“A”,1.52,“x”));
添加(新仪表盘数据(“B”,2.22,“m”);
添加(新仪表盘数据(“A”,3.12,“m”);
添加(新仪表盘数据(“B”,2.52,“m”);
添加(新DashboardOneData(“C”,2.85,“y”);
添加(新DashboardOneData(“A”,2.22,“y”);
添加(新仪表盘数据(“A”,3.12,“y”);
添加(新仪表盘数据(“B”,1.01,“m”);
添加(新DashboardOneData(“C”,2.85,“y”);
Iterator it=items.Iterator();
while(it.hasNext()){
DashboardOneData DashboardOneData=it.next();
字符串键=dashboardOneData.getDiviName()+“-”+dashboardOneData.getmLevel();
if(汇总容器(关键)){
double sum=sumMap.get(键);
sum+=dashboardOneData.getFullHours();
求和放(键、和);
}
否则{
sumMap.put(键,dashboardOneData.getFullHours());
}
}
系统输出打印项次(sumMap);
}   
}

将键声明为字符串(DashboardOneData中字符串属性的组合)和值声明为双精度的映射。如果键存在,则获取值并添加新的双精度值。就像在列表中计算重复项一样。

您是否使用getter和setter登录到constructor中?您尝试过做什么?甚至不是一个简单的循环?如何向新的DashboardOneData ArrayList添加新值?我在android studio中遇到了一个错误。我尝试了两种方法,但都没有解决问题。错误:com.android.builder.dexing.DexArchiveBuilderException:无法处理。错误:com.android.builder.dexing.DexArchiveBuilderException:错误:com.android.dx.cf.code.SimException:未使用的默认或静态接口方法--min sdk版本>=24错误:任务执行失败:app:transformClassesWithDexBuilderForDebug.com.android.builder.dexing.DexArchiveBuilderException:@D.Madu我不知道您正在使用安卓工作室。您需要Java8支持。我不确定哪一个Android Studio版本/Android API级别支持Java 8.ohhh…我很抱歉没有通知您。你能给我一个Java7的解决方案吗。min api是16。我可以这样使用sumMap吗??Map sumMap=newtreemap();因为以后我想要两个字符串值以及双精度值。将这三个值都放到sumMapi中,我得到java.lang.ClassCastException:java.util.ArrayList是不可比较的错误。Map sumMap=newtreemap();字符串键=dashboardOneData.getDiviName()+“-”+dashboardOneData.getmLevel();如果(sumMap.containsKey(key)){double sum=sumMap.get(key);sum+=dashboardOneData.getFullHours();sumMap.put(dArray,sum);}其他{sumMap.put(dArray,dashboardOneData.getFullHours());}这是因为自定义类dashboardOneData没有任何比较机制。Integer、String、Double等类实现了可比较的接口。您的类应该是Comparable或Comparator类型。盲规则-如果您正在将类的对象(未实现任何比较机制)添加到已排序集合(如TreeSet、TreeMap)中,它将抛出ClassCastException,表示我无法比较对象已删除以前的注释,则不需要NewItems始终为空
Set<DashboardOneData> newItems = new HashSet<DashboardOneData>();

for (DashboardOneData dashboardOneData : items) {
int double sum =0;
 for (int i = 0; i < items.size(); i++) {
    if(dashboardOneData.diviName.equals(items.get(i).diviName) && dashboardOneData.mLevel.equals(items.get(i).mLevel) ){
    sum=sum+dashboardOneData.fullHours;
    if(i==items.size()-1){
        newItems.add(dashboardOneData);
     }
    }
}
}
class DashboardOneData {
    private String diviName;
    private double fullHours;
    private String mLevel;
    public String getDiviName() {
        return diviName;
    }
    public void setDiviName(String diviName) {
        this.diviName = diviName;
    }
    public double getFullHours() {
        return fullHours;
    }
    public void setFullHours(double fullHours) {
        this.fullHours = fullHours;
    }
    public String getmLevel() {
        return mLevel;
    }
    public void setmLevel(String mLevel) {
        this.mLevel = mLevel;
    }
    public DashboardOneData(String diviName, double fullHours, String mLevel) {
        super();
        this.diviName = diviName;
        this.fullHours = fullHours;
        this.mLevel = mLevel;
    }
}

public class AddListItemsBasedOnAttributes {

    public static void main(String[] args) {
        Map<String, Double> sumMap = new TreeMap<String, Double>();

        List<DashboardOneData> items = new ArrayList<DashboardOneData >();
        items.add(new DashboardOneData ("A", 1.11 , "x"));
        items.add(new DashboardOneData ("A", 1.52 , "x"));
        items.add(new DashboardOneData ("B", 2.22 , "m"));
        items.add(new DashboardOneData ("A", 3.12 , "m"));
        items.add(new DashboardOneData ("B", 2.52 , "m"));
        items.add(new DashboardOneData ("C", 2.85 , "y"));
        items.add(new DashboardOneData ("A", 2.22 , "y"));
        items.add(new DashboardOneData ("A", 3.12 , "y"));
        items.add(new DashboardOneData ("B", 1.01 , "m"));
        items.add(new DashboardOneData ("C", 2.85 , "y"));

        Iterator<DashboardOneData> it = items.iterator();
        while(it.hasNext()) {
            DashboardOneData dashboardOneData = it.next();
            String key = dashboardOneData.getDiviName() + "-" + dashboardOneData.getmLevel();
            if(sumMap.containsKey(key)) {
                double sum = sumMap.get(key);
                sum += dashboardOneData.getFullHours();
                sumMap.put(key, sum);
            }
            else {
                sumMap.put(key, dashboardOneData.getFullHours());
            }
        }
        System.out.println(sumMap);
    }   
}