Java 获取同一字符串组中ArrayList中的双值之和
我有一个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
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);
}
}