以指定顺序从LinkedHashMap检索KeySet

时间:2016-11-07 06:04:33

标签: java linkedhashmap treeset

我正在编写一个从List of LinkedHashMap中提取密钥的程序。然后,提取的密钥将以逗号连接,并在CSV文件中打印为列标题。

flatJson的示例内容如下所示:

{
  Submitted_Date=03-11-2016 01:19:41, 
  Comments=, 
  Rating=3,
  details.name=Willy,  
  details.personalId=S123456A,
  details.mobileNo=11111111, 
  details.email=willy@email.com,
  Channel=desktop, 
  Referral_Code=, 
  discount.promoCode=,
  discount.referral=, 
  policyPlan.grossPremium=788.64,
  policyPlan.name=Standard, 
  policyPlan.netPremium=788.64
}

代码:

private TreeSet<String> collectHeaders(List<LinkedHashMap<String, String>> flatJson) {
    TreeSet<String> headers = new TreeSet<String>();
    for (LinkedHashMap<String, String> linkedMap : flatJson) {
        headers.addAll(linkedMap.keySet());
    }
    return headers;
}

我从这个程序获得的标题的顺序是:

Channel
Comments
Rating
Referral_Code
Submitted_Date
details.email
details.personalId
details.mobileNo
details.name
discount.promoCode
discount.referral
policyPlan.grossPremium
policyPlan.name
policyPlan.netPremium

虽然预期输出与flatJson

相同
Submitted_Date
Comments
Rating
details.name
details.personalId
details.mobileNo
details.email
Channel
Referral_code
discount.promoCode
discount.referral
policyPlan.grossPremium
policyPlan.name
policyPlan.netPremium

以前,我使用HashMapSet不支持订购。我已将其更改为LinkedHashMapTreeSet,但仍无法获得正确的订单。

1 个答案:

答案 0 :(得分:2)

TreeSet不是要保留插入顺序。它是关于排序的元素。

换句话说:如果您将字符串对象添加到TreeSet,它们会有序,就好像您将排序该列表一样!< / p>

因此,如果主要关注 order ,则应使用LinkedHashSet而不是TreeSet!或者,您可以在创建TreeSet时提供自定义Comparator ...以某种方式为您提供您正在寻找的订单 - 这可能有用,但闻起来像是我的hackish办法。