Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中减去两个不同列表中的值_Java_Android_Arrays - Fatal编程技术网

Java 在android中减去两个不同列表中的值

Java 在android中减去两个不同列表中的值,java,android,arrays,Java,Android,Arrays,我有一个年的整数数组和它对应的值,它看起来像下面的代码 int[] earningYear = {2012,2013,2014}; int[] earningAmount = {100,150,120}; int[] expenseYear = {2012,2014}; int[] expenseAmount = {50,30}; 我想从对应年份的收入金额中减去支出金额,输出列表应该如下所示 int[] savingsYear = {2012,2013,2014}; int[] savings

我有一个年的整数数组和它对应的值,它看起来像下面的代码

int[] earningYear = {2012,2013,2014};
int[] earningAmount = {100,150,120};
int[] expenseYear = {2012,2014};
int[] expenseAmount = {50,30};
我想从对应年份的收入金额中减去支出金额,输出列表应该如下所示

int[] savingsYear = {2012,2013,2014};
int[] savingsamount = {50,150,90};

请帮我做这件事。提前感谢

如果earningYear始终包含所有年份,并且earningYear和expenseYear都已排序,那么这将是一个可能的解决方案

int[] earningYear = {2012,2013,2014};
int[] earningAmount = {100,150,120};
int[] expenseYear = {2012,2014};
int[] expenseAmount = {50,30};

int[] savingsYear = new int[earningYear.length()];
int[] savingsAmount = new int[earningYear.length()];

int expenseYearIndex = 0;

for(int i = 0; i < earningYear.length(); i++) {
    savingsYear[i] = earningYear[i];
    savingsAmount[i] = earningsAmount[i];
    if(expenseYear.length() > 0 && expenseYear[expenseYearIndex] == earningYear[i]) {
        savingsAmount[i] -= expenseYear[expenseYearIndex];
        expenseYearIndex++;
    }
}
int[]盈利年={201220132014};
int[]earningAmount={100150120};
国际[]支出年度={20122014};
int[]支出金额={50,30};
int[]savingsYear=新int[earningYear.length()];
int[]savingsAmount=新int[earningYear.length()];
国际支出年度指数=0;
对于(int i=0;i0&&expenseYear[expenseYearIndex]==收益年[i]){
储蓄金额[i]=支出年度[expenseYearIndex];
expenseYearIndex++;
}
}
这应该可以做到


然而,更好的解决方案是列出一份已经提出的清单,以及一些保存年份和年度金额的对象

@umair.ali和@Casper给出的答案很好,将数组转换为地图是一条可行之路。
我建议使用
TreeMap
(或
SortMap
接口的其他实现)。默认情况下,树映射按升序对其键进行排序。这样,如果您真的想得到一个简单的节省数组,那么在处理后就不必进行任何笨拙的地图排序

以下是完整的示例:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

public class SavingsApp {

    public Map<Integer, Integer> arraysToMap(int[] years, int[] money) {
        Map<Integer, Integer> newMap = new HashMap<Integer, Integer>();
        if (years == null || money == null || years.length != money.length) {
            throw new IllegalArgumentException();
        }
        for (int i=0; i< years.length; i++ ) {
            newMap.put(years[i], money[i]);
        }

        return newMap;
    }

    public Map<Integer, Integer> calculateSavings(Map<Integer, Integer> earningsMap, Map<Integer, Integer>expensesMap) {
        Map<Integer, Integer> savingsMap = new TreeMap<Integer, Integer>();
        savingsMap.putAll(earningsMap);

        for (Entry<Integer, Integer> expensePerYear : expensesMap.entrySet()) {
            Integer year = expensePerYear.getKey();
            Integer expense = expensePerYear.getValue();

            Integer earning = savingsMap.get(year);
            if (earning == null) {
                earning = 0;
            }
            savingsMap.put(year, earning-expense);
        }
        return savingsMap;
    }


    public static void main(String[] args) {
        int[] earningYear = {2012,2013,2014};
        int[] earningAmount = {100,150,120};
        int[] expenseYear = {2012,2014};
        int[] expenseAmount = {50,30};

        SavingsApp app = new SavingsApp();

        // convert arrays to maps
        Map<Integer, Integer> earningsMap = app.arraysToMap(earningYear, earningAmount);
        Map<Integer, Integer> expensesMap = app.arraysToMap(expenseYear, expenseAmount);

        // compute savings per year
        Map<Integer, Integer> savingsMap = app.calculateSavings(earningsMap, expensesMap);

        // convert result map to array
        List<Integer> savingsList = new ArrayList<Integer>(savingsMap.values());
        Integer[] savingsArray = new Integer[savingsList.size()];
        savingsList.toArray(savingsArray);
    }
}
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
导入java.util.TreeMap;
公共级储蓄{
公共地图阵列地图(整数[]年,整数[]货币){
Map newMap=newhashmap();
如果(年==null | | |金钱==null | |年.length!=金钱.length){
抛出新的IllegalArgumentException();
}
对于(int i=0;i

需要注意的一点是,
savingsArray
将是
Integer[]
类型,而不是
int[]

这在使用数组(不知道您使用的是哪种语言)时太棘手了,请尝试使用一些具有1-1元素映射的集合类(如java中的Map或c#.Net中的Dictionary)。那么事情就太简单了。谢谢你的回答。由于我是android新手,请告诉我如何使用列表来做这些事情,谢谢u@Pawe厄维斯基对此给出了答案。一个小小的建议是学习一点Java,因为这比Android更能转化为Java特有的问题。对于纯Java来说,这是一个很好的解决方案,但对于Android来说,如果可能的话,建议避免创建新对象。上面的代码将在映射中创建许多
条目
对象、装箱的
整数
原语等。