1

年のリストが 5 つと、年リストに対応する金額のリストが 5 つあります。

year_Earnings = [2011,2012,2013];
year_Expense = [2011,2012];
year_Investment = [2013];
year_Returns=[];
year_Savings=[2011,2012,2013];


amount_Earnings = [10,20,7];
amount_Expense = [5,10];
amount_Investment = [5];
amount_Returns=[];
amount_Savings=[5,10,7];            

明らかに、単一の for ループですべてのリストを反復しようとすると、ArrayIndexOutOfBoundException が発生します。だから私は以下のコードを使用して、キーと値のペアを持つハッシュマップにこのすべてのリストを変換しました

 Map<Double, Double> earningsMap = listToMap(year_Earnings, amount_Earnings);
     Map<Double, Double> expensesMap = listToMap(year_Expense, amount_Expense);
     Map<Double, Double> investmentMap = listToMap(year_Investment, amount_Investment);
     Map<Double, Double> returnsMap = listToMap(year_Returns, amount_Returns);
     Map<Double, Double> savingsMap = listToMap(year_Savings, amount_Savings);



public Map<Double, Double> listToMap(List<Double> years, List<Double> money) {
    Map<Double, Double> newMap = new HashMap<Double, Double>();
    if (years == null || money == null || years.size() != money.size()) {
        throw new IllegalArgumentException();
    }
    for (int i=0; i< years.size(); i++ ) {
        newMap.put(years.get(i), money.get(i));
    }

    return newMap;
}

今、私は以下のようなリストが欲しい

year_Earnings = [2011,2012,2013];
year_Expense = [2011,2012,2013];
year_Investment = [2011,2012,2013];
year_Returns=[2011,2012,2013];
year_Savings=[2011,2012,2013];


amount_Earnings = [10,20,7];
amount_Expense = [5,10,0];
amount_Investment = [0,0,5];
amount_Returns=[0,0,0];
amount_Savings=[5,10,7];

誰でもこのようなことをするのを手伝ってくれませんか..事前に感謝します

4

4 に答える 4

0

そのような複雑で堅牢なアーキテクチャを持つ代わりに、それに取り組むことをお勧めします。

トランザクションの種類を格納する列挙型

public enum FinancialType {
 EARNING,
 EXPENSE,
 INVESTMENT,
 RETURN,
 SAVING;
}

を格納するクラス

public class FinancialOperation {
  private final FinancialType type;
  private final int year;
  private final BigDecimal value;
}

リストを構造体に変換する util メソッド。

    private List<FinancialOperation> createFinancialOperation(FinancialType type, List<Double> years, List<Double> money) {

     List<FinancialOperation> result = new ArrayList<>();

     for(int i = 0; i < years.size(); i++) {

        Double year = years.get(i);
        Double money = moneys.get(i);

        if(year == null) {
           continue; //or throw
        }

        BigDecimal amount = BigDecimal.ZERO;

        if(money != null) {
          amount = new BigDecimal(money,MathContext.DECIMAL128);
        }

        result.add(new FinancialOperation(type,year.intValue(),amount);
     }

     return result;

}

使用法は想像するのは非常に簡単です。

List<FinancialOperation> earningsList =  createFinancialOperation(FinancialType.EARNING,year_Earnings, amount_Earnings);
List<FinancialOperation> investmentList =  createFinancialOperation(FinancialType.INVESTMENT,year_Investment, amount_Investment);

Map<FinancialType,List<FinancialOperation>> map = new HashMap<>();

  map.put(FinancialType.EARNING,earningsList);
  map.put(FinancialType.INVESTMENT,investmentList);
于 2013-04-05T10:04:59.887 に答える
0

次のユーティリティ メソッドを使用して、追加のデータ構造なしで実行できます。

public static int[] values(int[] arr, int[] years, int firstYear, int lastYear) {
        int[] res = new int[lastYear-firstYear+1];
        int arrPos = 0;
        for(int i = 0; i < res.length; i++) {
            int year = firstYear + i;
            if (arrPos==arr.length || years[arrPos] >  year)
                res[i] = 0;
            else
                res[i] = arr[arrPos++];
        }
        return res;
    }

入力配列arrには任意の数のギャップを含めることができ、出力は firstYear から lastYear までの連続した年に対応する配列になります。

最初に、すべての年の配列で年の最小値と最大値を見つける必要があります。

于 2013-04-05T09:56:18.817 に答える
0

年のリストが 5 つと、年リストに対応する金額のリストが 5 つあります。

=>これに従うと、10個のリストを管理する必要があるため、これは悪い解決策ArrayList<Object>です。代わりに、 Only Single を作成することをお勧めします。すべてのアイテムはオブジェクトタイプになります。

1) getter/setter メソッドで Earnings クラスを 1 つ定義します。

public class Earning {

    int year;
    int amount;

    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getAmount() {
        return amount;
    }
    public void setAmount(int amount) {
        this.amount = amount;
    }
}

2) タイプを定義ArrayList<Earning>し、いつでも Earnings タイプのオブジェクトを作成し、ArrayList 内に配置します。

于 2013-04-05T10:12:40.900 に答える