Как отсортировать List<Object> в Map<String, Object> в Java?

У меня есть две карты, Map<String,Object> которые выглядят так:

Map<String, Object> map1 = {
    taxRate = {rateType=EXCLUSIVE, rate=0.07}, 
    taxAmount = {currencyCode=USD, amount=7.0},
    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=}],
    withholdingJurisdictionTaxes=[]
}

Map<String, Object> map2 = {
    taxRate = {rateType=EXCLUSIVE, rate=0.07}, 
    taxAmount = {currencyCode=USD, amount=7.0},
    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=}],
    withholdingJurisdictionTaxes=[]
}

Я сравниваю эти две карты, используя

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

Однако, если вы посмотрите на второе значение ключа на карте, это список объектов. Порядок имеет значение при расчете разницы. Поэтому мне нужно отсортировать этот конкретный список, прежде чем найти Map.difference.

Можете ли вы помочь мне понять, как я могу отсортировать этот список?

Я пробовал следующее:

1. Collections.sort(Arrays.asList(leftMap.get("jurisdictionTaxes")));

Error: Required type: List <T>
Provided: List <Object>

2. Arrays.asList(leftMap.get("jurisdictionTaxes")).sort((s1, s2) -> s1.get("jurisdictionLevel") - s2.get("jurisdictionLevel"));

Error: Cannot resolve method 'get' in 'Object'
 public static <K, V> MapDifference<K, V> difference(Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
        if (left instanceof SortedMap) {
            SortedMap<K, ? extends V> sortedLeft = (SortedMap)left;
            return difference(sortedLeft, right);
        } else {
            return difference(left, right, Equivalence.equals());
        }
    }

Я не могу понять структуру данных карт. Также Maps и MapDifference. Нужно больше кода, чтобы увидеть.

Erwin 04.04.2023 04:19

Каковы критерии сортировки списка?

prasad_ 04.04.2023 04:38

Критерии сортировки могут быть любыми, мне просто нужно, чтобы порядок был одинаковым на обеих картах.

Blake 04.04.2023 07:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что это ключ:

Error: Required type: List <T>

Для сортировки требуется сопоставимый класс для сортировки. Попробуйте это, чтобы отсортировать юрисдикциюTaxes:

    Arrays.sort((JurisdictionTax[]) map1.get("jurisdictionTaxes"));

Например:

static Map<String, Object> map1 = new HashMap<>();

static {
    map1.put("taxRate", "rateType=EXCLUSIVE, rate=0.07");
    map1.put("taxAmount", "currencyCode=USD, amount=7.0");
    map1.put("jurisdictionTaxes", new JurisdictionTax[] { new JurisdictionTax(new TaxRate("bbb")),
            new JurisdictionTax(new TaxRate("aaa")) });
    map1.put("withholdingJurisdictionTaxes", "[]");
}

static Map<String, Object> map2 = new HashMap<>();

static {
    map2.put("taxRate", "rateType=EXCLUSIVE, rate=0.07");
    map2.put("taxAmount", "currencyCode=USD, amount=7.0}");
    map2.put("jurisdictionTaxes", new JurisdictionTax[] { new JurisdictionTax(new TaxRate("ccc")),
            new JurisdictionTax(new TaxRate("aaa")) });
    map2.put("withholdingJurisdictionTaxes", "[]");
}

public static void main(String[] args) {
System.out.println("map1 before: " + ((JurisdictionTax[])map1.get("jurisdictionTaxes"))[0]);
System.out.println("map2 before: " + ((JurisdictionTax[])map2.get("jurisdictionTaxes"))[0]);

Arrays.sort((JurisdictionTax[]) map1.get("jurisdictionTaxes"));
Arrays.sort((JurisdictionTax[]) map2.get("jurisdictionTaxes"));

System.out.println("map1 after: " + ((JurisdictionTax[])map1.get("jurisdictionTaxes"))[0]);
System.out.println("map2 after: " +    ((JurisdictionTax[])map2.get("jurisdictionTaxes"))[0]);

печатает:

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

С определенными классами:

public class JurisdictionTax implements Comparable<JurisdictionTax> {
public JurisdictionTax(TaxRate taxRate) {
    super();
    this.taxRate = taxRate;
}
public String jurisdictionLevel;
public TaxAmount taxAmount;
public TaxRate taxRate;
public String displayName;
public String jurisdictionName;
public String responsiblePartyReason;


@Override
public int compareTo(JurisdictionTax other) {
    // incomplete
    return this.taxRate.rateType.compareTo(other.taxRate.rateType);
}


@Override
public String toString() {
    return "JurisdictionTax [jurisdictionLevel = " + jurisdictionLevel + ", taxAmount = " + taxAmount + ", taxRate = "
            + taxRate + "]";
}
    


}

и т. д.

Другие вопросы по теме