Java映射来自两个数组的数据并插入到第三个数组中

时间:2017-05-21 01:20:28

标签: java arrays sorting

我很难将两个列表中的数据映射到第三个列表中。我的样本数据如下:

Categorylist ID:  1,2,3,4,5,6,7,8,9,10,42,46,49,50
CurrentMonthByCat ID: 1,2,3,4,5,6,7,8,9,10,42,49,50
(the transaction amount value for CurrentMonthByCat: 92,46,40,180,60,10,1510,200,500,10,234,12)

currentMonthByCat中缺少46。我试图这样做,如果类别列表ID中不存在currentMonthByCat ID,我将在第三个列表中插入0而不是从CurrentMonthByCat获取交易金额并将其推入第三个列表。

ArrayList<Double> total = new ArrayList<Double>();

    for(int i = 0; i < categorylist.size(); i++){
        for(int j = 0; j < currentMonthByCat.size(); j++){
            if(categorylist.get(i).getCategoryID().equals(currentMonthByCat.get(j).getCategory().getCategoryID())){
                Log.d("IIIII", categorylist.get(i).getCategoryID());
                Log.d("JJJJJ", currentMonthByCat.get(j).getCategory().getCategoryID());
                total.add((double)currentMonthByCat.get(j).getTransactionAmt());
            }else{
                total.add(0.0);
            }
        }
    }

    for(int k = 0; k < total.size(); k++){
        Log.d("KKKKK", String.valueOf(total.get(k)));
    }

但总清单的打印结果是:

  92,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0...

我的期望是:

  92,46,40,180,60,10,1510,200,500,10,0,234,12

我只想在currentMonthByCat中的ID与categorylist中的ID不匹配时才插入0。例如,ID 46是右边的第3个位置。

我意识到原因是因为我首先将92插入第三个数组,然后类别列表ID仍为1,然后它将与currentMonthByCat中的所有其余部分进行比较,然后再转移到ID 2.这就是为什么不必要的零。但我不确定如何实际排序以达到我想要的效果。

有什么想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:0)

将您的值放入Map<Integer, Double>

Map<Integer, Double> map = new HashMap<Integer, Double>();
for (int i = 0; i < currentMonthByCat.size(); ++i) {
    //... categoryId = currentMonthByCat.get(i).categoryId
    //... amount = currentMonthByCat.get(i).amount
    map.put(categoryId, amount);
}

然后使用Categorylist ID中的值遍历地图:

// create result arraylist
ArrayList<Double> total = new ArrayList<Double>();
for (int i = 0; i < categorylist.size(); ++i) {
    Double amount = map.get(categorylist.get(i));
    if (amount == null) {
        total.add(0.0);
    } else {
        total.add(amount);
    }
}

结果列表total将包含现有映射的数量,或者不存在的零。

其他方式 如果有保证,则对categorylist进行排序,并对CurrentMonthByCat进行排序

然后你可以遍历其中一个列表,同时将索引/光标保持在另一个列表中,而不是从头开始迭代另一个列表,而是从之前记住的游标值开始,从而产生比n ^ 2更好的平均性能

答案 1 :(得分:0)

这很简单。除非内部循环完成,否则您无法决定在总数组中添加零或值。所以可能你添加元素existAtIndex并用-1初始化它,如果找到元素然后在循环中将索引分配给existAtIndex并打破循环,或者如果它不存在那么你加零。所以代码将是这样的:

ArrayList<Double> total = new ArrayList<Double>();
int existAtIndex;
    for(int i = 0; i < categorylist.size(); i++){
        // search for the element index
        existAtIndex = -1;
        for(int j = 0; j < currentMonthByCat.size(); j++){
            if(categorylist.get(i).getCategoryID().equals(currentMonthByCat.get(j).getCategory().getCategoryID())){

                existAtIndex = j;
                break;
            }
        }

        // add the value in the element index or add zero if the element not exist
        if (existAtIndex != -1) {
          total.add((double)currentMonthByCat.get(existAtIndex).getTransactionAmt());
        }
        else {
            total.add(0.0);
        }
    }

    for(int k = 0; k < total.size(); k++){
        Log.d(String.valueOf(total.get(k)));
    }

对于更好的代码,您可以使用contains方法检查项目是否存在(如果存在),而不是使用基本循环。祝你好运

答案 2 :(得分:0)

您有很多代码可以帮助您完成此处的操作。我认为以下代码片段以非常易读和可维护的方式完成您想要的内容。

    //First of all we are interested in getting a transaction amount for each value in currentMonthByCat
    //so loop around using your object (not sure what it's called)
    for(CurrentMonth value : currentMonthByCat){
        //check if it's present. 
        //We create a new method here that gets you your category list as a list of integers. 
        //This is key to making the whole method much more readable.
        if(categorylist.getIdsAsList().contains(value.getCategory().getCategoryID())){
            //it is so add it
            total.add(value.getTransactionAmt());
        } else {
            //it's not so add a 0
            total.add(0.0);
        }
    }

getIdsAsList方法可能如下所示:

public List<Integer> getIdsAsList(){
    List<Integer> result = new ArrayList<>();
    for (CategoryListItem item : categorylist) {
        result.add(item.getCategoryId());
    }
    return result;
}