2016-04-27 40 views
0

一個.txt文件。使用下面的java代碼讀取文件並使用二維數組(用戶的一維和產品的其他維度)來存儲訂單#。另外,使用字典將每個用戶映射到其對應的數組行。如何用二維數組中的0替換缺失值?Java HashMap:如何修改矩陣的輸出?

用戶,產品,訂單號:

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 

下面的解決方案進行加工。但缺失值時,二維數組將具有不同的列長度。如何用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 
+0

是否'INT爲了=的Integer.parseInt(列[2]);'不扔你NumberFormatException的?如果沒有,那麼'訂單'的價值是什麼? – user3207158

+0

如果我用0替換缺失的值,它不會拋出NumberFormatException。但是,.txt文件包含缺少的值。我的問題是如何從.txt文件讀取數據時用0替換缺失值?謝謝! – Harry

+0

我很困惑。你說如果用數字(0)替換缺失的列,它不會拋出異常。但是在OP中,你說代碼已經工作(工作)了。那麼你的編碼是否與缺失的數字一起工作併產生你提供的5乘2矩陣? – user3207158

回答

1

,因爲它會在一個數組索引外的束縛異常停止時,簡單的解決方案是檢查columns.length == 3 。如果是,則解析int;否則分配order爲0

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

謝謝!有效! – Harry

+0

然後考慮接受答案。 – user3207158