2016-11-02 46 views
3

的位置層次,我有以下位置的層次結構:建設計數

public class Location { 
    public Location parentLocation; 
    public String name; 
    public int id; 
} 

List<Location> listOfCities; // This list strictly contains all "city" level locations like Chicago, Atlanta etc. 

假設一秒鐘的parentLocation只能是國家和一個國家的parentLocation爲空。即。如果我有一個芝加哥的位置,芝加哥位置對象的parentLocation將是USA,並且鏈將終止在那裏,因爲位置USA有parentLocation = null。我有市級位置對象的列表,我想獲得以下罪狀:

USA (20) 
    - Chicago (12) 
    - New York (1) 
    - Oregon (5) 
    - Atlanta (2) 
Mexico (1) 
    - Puebla (1) 

是否有Java8一個方便的方式來獲得jsonable對象將是我上面描述對於一個給定的計數層次城市地點列表?我嘗試:

// Get counts of all cities in listOfCities (ie. Chicago -> 12) 
Map<String, Integer> cityCounts = listOfCities.stream() 
.map(Location::name) 
.collect(Collectors.toMap(city -> city, city -> 1, Integer::sum)); 

我不確定究竟如何通過parentLocation雖然獲得了「捲起」計數和讓所有物體可以在方式走到如上漂亮的印刷單幹淨的響應對象。

+1

確實芝加哥有12個,因爲有其他12個城市,芝加哥是家長嗎? 「listOfCities」是所有地點,父母和非父母的「列表」嗎? – 4castle

+1

@ 4castle芝加哥有12個,因爲有12個城市的String name =「Chicago」。 listOfCities是所有非父母(即,城市級別位置對象)的列表。城市之外沒有位置級別,城市的父級位置=國家/地區。 –

+1

謝謝,這清除了事情。 'USA'會被包含在輸出'Map'中的關鍵字嗎? – 4castle

回答

4

您可以生成Map<String, Map<String, Long>>,其中國家名稱在外部地圖中,城市名稱/計數在內部地圖中。

import static java.util.stream.Collectors.*; 

Map<String,Map<String,Long>> cityCountsByCountry = listOfCities 
    .stream() 
    .collect(groupingBy(city -> city.parentLocation.name, 
       groupingBy(city -> city.name, 
        counting()))); 

這將產生類似這樣的JSON的結構:

{ 
    "USA": { 
    "Chicago": 12, 
    "New York": 1, 
    "Oregon": 5, 
    "Atlanta": 2 
    }, 
    "Mexico": { 
    "Puebla": 1 
    } 
} 
+0

需要在分組中添加空檢查...城市 - > city.parentLocation == null? city.name:city.parentLocation.name' –

+1

@Bolzano「listOfCities」中的所有元素都是城市。他們都不會有'null'作爲父母。 – 4castle

+0

meh ..我認爲有一個更大的挑戰,像列表包含除nvm之外的所有這些工作如預期那樣,很好。 –