如何在Java中对Map<String, Object>中的List<Object>进行排序?

huangapple go评论104阅读模式
英文:

How to sort List<Object> in a Map<String, Object> in Java?

问题

I have two maps, Map<String, Object> which looks like:

  1. Map<String, Object> map1 = {
  2. taxRate={rateType=EXCLUSIVE, rate=0.07},
  3. taxAmount={currencyCode=USD, amount=7.0},
  4. jurisdictionTaxes=[{jurisdictionLevel=State, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=County, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=City, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=District, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}],
  5. withholdingJurisdictionTaxes=[]
  6. }
  7. Map<String, Object> map2 = {
  8. taxRate={rateType=EXCLUSIVE, rate=0.07},
  9. taxAmount={currencyCode=USD, amount=7.0},
  10. jurisdictionTaxes=[{jurisdictionLevel=State, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=County, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=City, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=District, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}],
  11. withholdingJurisdictionTaxes=[]
  12. }

I am comparing these two maps using:

  1. Map<String, Object> flatMap1 = FlatMapUtil.flatten(map1);
  2. Map<String, Object> flatMap2 = FlatMapUtil.flatten(map2);
  3. MapDifference<String, Object> difference = Maps.difference(flatMap1, flatMap2);

However, if you look at the second key value in the map, it is a list of objects. The order matters while calculating the difference. So, I would need to sort that particular list before finding the Map.difference.

Can you help me understand how I can sort this List<Object>?

I tried the following:

  1. 1. Collections.sort(Arrays.asList(leftMap.get("jurisdictionTaxes")));
  2. Error: Required type: List <T>
  3. Provided: List <Object>
  4. 2. Arrays.asList(leftMap.get("jurisdictionTaxes")).sort((s1, s2) -> s1.get("jurisdictionLevel") - s2.get("jurisdictionLevel"));
  5. Error: Cannot resolve method 'get' in 'Object'
  1. public static <K, V> MapDifference<K, V> difference(Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
  2. if (left instanceof SortedMap) {
  3. SortedMap<K, ? extends V> sortedLeft = (SortedMap)left;
  4. return difference(sortedLeft, right);
  5. } else {
  6. return difference(left, right, Equivalence.equals());
  7. }
  8. }

(Note: I've translated the code and provided the relevant portions as requested.)

英文:

I have two maps, Map&lt;String,Object&gt; which looks like:

  1. Map&lt;String, Object&gt; map1 = {
  2. taxRate={rateType=EXCLUSIVE, rate=0.07},
  3. taxAmount={currencyCode=USD, amount=7.0},
  4. jurisdictionTaxes=[{jurisdictionLevel=State, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=County, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=City, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=District, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}],
  5. withholdingJurisdictionTaxes=[]
  6. }
  7. Map&lt;String, Object&gt; map2 = {
  8. taxRate={rateType=EXCLUSIVE, rate=0.07},
  9. taxAmount={currencyCode=USD, amount=7.0},
  10. jurisdictionTaxes=[{jurisdictionLevel=State, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=County, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=City, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}, {jurisdictionLevel=District, taxAmount={currencyCode=USD, amount=null}, taxRate={rateType=EXCLUSIVE, rate=null}, displayName=, jurisdictionName=, responsiblePartyReason=}],
  11. withholdingJurisdictionTaxes=[]
  12. }

I am comparing these two maps using

  1. Map&lt;String, Object&gt; flatMap1 = FlatMapUtil.flatten(map1);
  2. Map&lt;String, Object&gt; flatMap2 = FlatMapUtil.flatten(map2);
  3. MapDifference&lt;String, Object&gt; difference = Maps.difference(flatMap1, flatMap2);

However if you look at the second key value in the map, it is a list of objects. The order matters while calculating the diff. So I would need to sort that particular list before finding the Map.difference.

Can you help me understand how I can sort this List<Object>?

I tried the following:

  1. 1. Collections.sort(Arrays.asList(leftMap.get(&quot;jurisdictionTaxes&quot;)));
  2. Error: Required type: List &lt;T&gt;
  3. Provided: List &lt;Object&gt;
  4. 2. Arrays.asList(leftMap.get(&quot;jurisdictionTaxes&quot;)).sort((s1, s2) -&gt; s1.get(&quot;jurisdictionLevel&quot;) - s2.get(&quot;jurisdictionLevel&quot;));
  5. Error: Cannot resolve method &#39;get&#39; in &#39;Object&#39;
  1. public static &lt;K, V&gt; MapDifference&lt;K, V&gt; difference(Map&lt;? extends K, ? extends V&gt; left, Map&lt;? extends K, ? extends V&gt; right) {
  2. if (left instanceof SortedMap) {
  3. SortedMap&lt;K, ? extends V&gt; sortedLeft = (SortedMap)left;
  4. return difference(sortedLeft, right);
  5. } else {
  6. return difference(left, right, Equivalence.equals());
  7. }
  8. }

答案1

得分: 1

I think that this is the key:

Error: Required type: List <T>

The sort needs a comparable class to sort with. Try this to sort the jurisdictionTaxes:

  1. Arrays.sort((JurisdictionTax[]) map1.get(&quot;jurisdictionTaxes&quot;));

Eg:

  1. static Map&lt;String, Object&gt; map1 = new HashMap&lt;&gt;();
  2. static {
  3. map1.put(&quot;taxRate&quot;, &quot;rateType=EXCLUSIVE, rate=0.07&quot;);
  4. map1 put(&quot;taxAmount&quot;, &quot;currencyCode=USD, amount=7.0&quot;);
  5. map1.put(&quot;jurisdictionTaxes&quot;, new JurisdictionTax[] { new JurisdictionTax(new TaxRate(&quot;bbb&quot;)),
  6. new JurisdictionTax(new TaxRate(&quot;aaa&quot;)) });
  7. map1.put(&quot;withholdingJurisdictionTaxes&quot;, &quot;[]&quot;);
  8. }
  9. static Map&lt;String, Object&gt; map2 = new HashMap&lt;&gt;();
  10. static {
  11. map2.put(&quot;taxRate&quot;, &quot;rateType=EXCLUSIVE, rate=0.07&quot;);
  12. map2.put(&quot;taxAmount&quot;, &quot;currencyCode=USD, amount=7.0}&quot;);
  13. map2.put(&quot;jurisdictionTaxes&quot;, new JurisdictionTax[] { new JurisdictionTax(new TaxRate(&quot;ccc&quot;)),
  14. new JurisdictionTax(new TaxRate(&quot;aaa&quot;)) });
  15. map2.put(&quot;withholdingJurisdictionTaxes&quot;, &quot;[]&quot;);
  16. }
  17. public static void main(String[] args) {
  18. System.out.println(&quot;map1 before: &quot; + ((JurisdictionTax[])map1.get(&quot;jurisdictionTaxes&quot;))[0]);
  19. System.out.println(&quot;map2 before: &quot; + ((JurisdictionTax[])map2.get(&quot;jurisdictionTaxes&quot;))[0]);
  20. Arrays.sort((JurisdictionTax[]) map1.get(&quot;jurisdictionTaxes&quot;));
  21. Arrays.sort((JurisdictionTax[]) map2.get(&quot;jurisdictionTaxes&quot;));
  22. System.out.println(&quot;map1 after: &quot; + ((JurisdictionTax[])map1.get(&quot;jurisdictionTaxes&quot;))[0]);
  23. System.println(&quot;map2 after: &quot; + ((JurisdictionTax[])map2.get(&quot;jurisdictionTaxes&quot;))[0]);
  24. }

prints:

  1. map1 before: JurisdictionTax [jurisdictionLevel=null, taxAmount=null, taxRate=TaxRate [rateType=bbb, rate=null]]
  2. map2 before: JurisdictionTax [jurisdictionLevel=null, taxAmount=null, taxRate=TaxRate [rateType=ccc, rate=null]]
  3. map1 after: JurisdictionTax [jurisdictionLevel=null, taxAmount=null, taxRate=TaxRate [rateType=aaa, rate=null]]
  4. map2 after: JurisdictionTax [jurisdictionLevel=null, taxAmount=null, taxRate=TaxRate [rateType=aaa, rate=null]]

With defined classes:

  1. public class JurisdictionTax implements Comparable&lt;JurisdictionTax&gt; {
  2. public JurisdictionTax(TaxRate taxRate) {
  3. super();
  4. this.taxRate = taxRate;
  5. }
  6. public String jurisdictionLevel;
  7. public TaxAmount taxAmount;
  8. public TaxRate taxRate;
  9. public String displayName;
  10. public String jurisdictionName;
  11. public String responsiblePartyReason;
  12. @Override
  13. public int compareTo(JurisdictionTax other) {
  14. // incomplete
  15. return this.taxRate.rateType.compareTo(other.taxRate.rateType);
  16. }
  17. @Override
  18. public String toString() {
  19. return &quot;JurisdictionTax [jurisdictionLevel=&quot; + jurisdictionLevel + &quot;, taxAmount=&quot; + taxAmount + &quot;, taxRate=&quot;
  20. + taxRate + &quot;]&quot;;
  21. }
  22. }

etc.

英文:

I think that this is the key:

  1. Error: Required type: List &lt;T&gt;

The sort needs a comparable class to sort with. Try this to sort the jurisdictionTaxes:

  1. Arrays.sort((JurisdictionTax[]) map1.get(&quot;jurisdictionTaxes&quot;));

Eg:

  1. static Map&lt;String, Object&gt; map1 = new HashMap&lt;&gt;();
  2. static {
  3. map1.put(&quot;taxRate&quot;, &quot;rateType=EXCLUSIVE, rate=0.07&quot;);
  4. map1.put(&quot;taxAmount&quot;, &quot;currencyCode=USD, amount=7.0&quot;);
  5. map1.put(&quot;jurisdictionTaxes&quot;, new JurisdictionTax[] { new JurisdictionTax(new TaxRate(&quot;bbb&quot;)),
  6. new JurisdictionTax(new TaxRate(&quot;aaa&quot;)) });
  7. map1.put(&quot;withholdingJurisdictionTaxes&quot;, &quot;[]&quot;);
  8. }
  9. static Map&lt;String, Object&gt; map2 = new HashMap&lt;&gt;();
  10. static {
  11. map2.put(&quot;taxRate&quot;, &quot;rateType=EXCLUSIVE, rate=0.07&quot;);
  12. map2.put(&quot;taxAmount&quot;, &quot;currencyCode=USD, amount=7.0}&quot;);
  13. map2.put(&quot;jurisdictionTaxes&quot;, new JurisdictionTax[] { new JurisdictionTax(new TaxRate(&quot;ccc&quot;)),
  14. new JurisdictionTax(new TaxRate(&quot;aaa&quot;)) });
  15. map2.put(&quot;withholdingJurisdictionTaxes&quot;, &quot;[]&quot;);
  16. }
  17. public static void main(String[] args) {
  18. System.out.println(&quot;map1 before: &quot; + ((JurisdictionTax[])map1.get(&quot;jurisdictionTaxes&quot;))[0]);
  19. System.out.println(&quot;map2 before: &quot; + ((JurisdictionTax[])map2.get(&quot;jurisdictionTaxes&quot;))[0]);
  20. Arrays.sort((JurisdictionTax[]) map1.get(&quot;jurisdictionTaxes&quot;));
  21. Arrays.sort((JurisdictionTax[]) map2.get(&quot;jurisdictionTaxes&quot;));
  22. System.out.println(&quot;map1 after: &quot; + ((JurisdictionTax[])map1.get(&quot;jurisdictionTaxes&quot;))[0]);
  23. System.out.println(&quot;map2 after: &quot; + ((JurisdictionTax[])map2.get(&quot;jurisdictionTaxes&quot;))[0]);

prints:

  1. map1 before: JurisdictionTax [jurisdictionLevel=null, taxAmount=null, taxRate=TaxRate [rateType=bbb, rate=null]]
  2. map2 before: JurisdictionTax [jurisdictionLevel=null, taxAmount=null, taxRate=TaxRate [rateType=ccc, rate=null]]
  3. map1 after: JurisdictionTax [jurisdictionLevel=null, taxAmount=null, taxRate=TaxRate [rateType=aaa, rate=null]]
  4. map2 after: JurisdictionTax [jurisdictionLevel=null, taxAmount=null, taxRate=TaxRate [rateType=aaa, rate=null]]

With defined classes:

  1. public class JurisdictionTax implements Comparable&lt;JurisdictionTax&gt; {
  2. public JurisdictionTax(TaxRate taxRate) {
  3. super();
  4. this.taxRate = taxRate;
  5. }
  6. public String jurisdictionLevel;
  7. public TaxAmount taxAmount;
  8. public TaxRate taxRate;
  9. public String displayName;
  10. public String jurisdictionName;
  11. public String responsiblePartyReason;
  12. @Override
  13. public int compareTo(JurisdictionTax other) {
  14. // incomplete
  15. return this.taxRate.rateType.compareTo(other.taxRate.rateType);
  16. }
  17. @Override
  18. public String toString() {
  19. return &quot;JurisdictionTax [jurisdictionLevel=&quot; + jurisdictionLevel + &quot;, taxAmount=&quot; + taxAmount + &quot;, taxRate=&quot;
  20. + taxRate + &quot;]&quot;;
  21. }
  22. }

etc

huangapple
  • 本文由 发表于 2023年4月4日 10:08:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/75924992.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定