Java HashMap:如何修改矩阵的输出?

时间:2016-04-27 02:40:35

标签: java arrays hashmap

.txt文件。使用以下java代码读取文件并使用二维数组(用户的一个维度和产品的其他维度)来存储订单#。此外,使用字典将每个用户映射到其对应的数组行。如何在2D数组中用0替换缺失值?

用户,产品,订单#:

name1   p1  5 
name1   p2   
name1   p3  2 
name2   p1  3 
name2   p2  1 
name2   p3  
name3   p1  5
name3   p2  
name3   p3  2
name4   p1  3
name4   p2  1
name4   p3  

以下解决方案已经完成。但是如果缺少值,则2D阵列将具有不同的列长度。如何用0替换缺失值以生成固定在列上的矩阵?

output:
  5 0 2
  3 1 0
  5 0 2
  3 1 0



Map<String, LinkedHashMap<String, Integer>> orderInfo = new LinkedHashMap<>();

while (userScanner.hasNextLine()) {
    String line = userScanner.nextLine();
     // To-Do : check regx
    String[] columns = line.split("\\t");

    String userId = columns[0];
    String productId = columns[1];
    int order = Integer.parseInt(columns[2]);
    LinkedHashMap<String, Integer> prodMap = orderInfo.get(userId);
    if (prodMap == null || prodMap.isEmpty()) {
        prodMap = new LinkedHashMap<String, Integer>();
    }
    prodMap.put(productId, new Integer(order));
    orderInfo.put(userId, prodMap);
}

int[][] matrix =  new int[orderInfo.size()][];
int row = 0 ;

// dictionary will contain Name as a key and belonging row as a value 
Map<String,Integer> dictionary = new HashMap<String,Integer>();

for (Entry<String, LinkedHashMap<String, Integer>> entry : orderInfo.entrySet())
{
    dictionary.put(entry.getKey(), row);
    matrix[row] = new int[entry.getValue().size()];
    int columns = 0;
    for(Entry<String, Integer> ent : entry.getValue().entrySet())  
    {
        matrix[row][columns] = ent.getValue();
        columns = columns + 1;
    }
    row = row + 1;
}

for (int rw = 0; rw < matrix.length; rw++) {
    for (int col = 0; col < matrix[rw].length; col++) {
        System.out.print(matrix[rw][col]+"    ");
    }
    System.out.println();
 }

System.out.println(dictionary);

以上代码只能生成如下的矩阵:

5 2
3 1
5 2
3 1

1 个答案:

答案 0 :(得分:1)

由于它将在数组索引超出范围的异常处停止,因此简单的解决方案是检查是否columns.length == 3。如果是,则解析int;否则将order指定为0。

int order;
if (columns.length == 3)
    order = Integer.parseInt(columns[2]);
else 
    order = 0;