2013-02-25 63 views
0

示例:一個查詢引發下一個結果集:我怎樣才能把一個大的數組列表分解成hashmap中的幾個列表?

名稱|年齡|總計

  • 約翰·史密斯,45,1000
  • 約翰·史密斯,56,800個
  • 約翰史密琴斯,34,500
  • 約翰·史密斯,56,500
  • 約翰·史密斯,56,1100

我想將這個數組列表分隔成三個,並將它們存儲在一個hashmap中,其中key是客戶端名稱。

我想這樣

Arraylist<Row> rows = dao.getClientActivity(); 
Map map = new HashMap<Clients Name, Clients Row>(); 
Arraylist<Row> = null; 


for (Row row : rows){ 

    if (map.get(row.clientName) == null) list = new ArrayList<Row>(); 

    list.add(row); 

    if(map.get(row.clientName) == null) map.put(row.clientName, list); 

} 

名單始終由名稱進行排序。

將上面的代碼片段作爲僞代碼,我沒有家中的編碼程序,我只是把它從頭頂上取下來,我想我在這個星期五測試了類似的東西,但它只在行上打印;

我不知道是否有更好的方法來做到這一點,但這是我首先想到的。

回答

3

你映射聲明應該如下(假設Row.clientNameString):

Map<String, List<Row>> map = new HashMap<String, List<Row>>(); 

而且for循環應該像下面這樣:

for (Row row : rows){ 
    /*Get the list of rows for current client name.*/ 
    List<Row> currRows = map.get(row.clientName); 
    if (currRows == null) {/*If not list exists for*/ 
     currRows = new ArrayList<Row>(); /*create a new one*/ 
     map.put(row.clientName, currRows); /*and put it in the map*/ 
    } 
    currRows.add(row);/*add the current row to the list*/ 
} 
1

我假設不存在你可以改變輸入格式。

我會建議你創建一個模型來表示一個客戶端:

public class Client { 

    private final String name; 
    private final byte age; //Nobody should be older than 256 
    private final int total; 

    /* Construct model */ 

    /* Getters/Functions */ 

} 

我也建議你創建內部Client一個工廠方法來創建從你的字符串輸入的類。

public static Client parseClient(String clientRep){ 

    String[] clientData = clientRep.split(','); 

    Client newClient = new Client(); //TODO: Name conventionally. 

    newClient.name = clientData[0]; 
    newClient.age = Byte.valueOf(clientData[1]); 
    newClient.total = Integer.valueOf(clientData[2]); 

    return newClient; 

} 

現在,您可以將這些添加到地圖(Map<String, Client>)。

String clientFromWherever = getWhateverDataFromWherever(); 

Map<String, Client> clientel = new HashMap<>(); 

Client addingToMap = Client.parseClient(clientFromWherever); 

clientel.put(addingToMap.getName() /* or however the name should be got */, addingToMap); 

這應該做得很好。

=====

但是 - 如果你不應該要使用的客戶端對象,我建議建立一個Map<String, int[]>和存儲陣列中的年齡和充電。如果您的收費不超過Short.MAXVALUE請使用short[]。存儲大量的陣列列表(或任何複雜的集合)只是爲了存儲少量的數據是不必要的。

ArrayList<Row> rows = dao.getClientActivity(); 
Map<String, int[]> clientelData = new HashMap<>(); 

for(Row clientRow : rows) { 

    if (!map.containsKey(clientRow.clientName) { 

     int[] clientNumericalData = new int[2]; 

     map.put(clientRow.clientName, clientNumericalData); 

    } 

} 
相關問題