Неправильный вывод при фильтрации хэш-карты

У меня есть хэш-карта, в которой есть ключ и значение в строке. Данные представлены в виде (table1, "table1:ssn1,ssn2,ssn3"). Имя таблицы в ключе состоит из имени исходной таблицы, а имя таблицы в значении - из имени целевой таблицы вместе с соответствующими именами исходных систем, разделенных знаком «:». Я пытаюсь передать имена исходной системы в аргументы командной строки, чтобы отфильтровать ключ и значение вместе с полученным именем исходной системы. Пока что я придумал следующий код:

public class FilterKeyValues {

    public static void main(String[] args) {
        String[] valArr;
        String ky;
        Map<String, String> hmap     = new HashMap<String, String>();
        Map<String, String> filtered = new HashMap<String, String>();

        hmap.put("Table1", "Table1:SSN1,SSN2,SSN3,SSN4,SSN5");
        hmap.put("Table2", "Table2:SSN1,SSN4,SSN2,SSN5,SSN8,SSN9,SSN10");
        hmap.put("Table3", "Table3:SSN4,SSN1");
        hmap.put("Table4", "Table4:SSN5,SSN6,SSN7");
        hmap.put("Table5", "Table5:SSN8,SSN1,SSN5,SSN2");

        if (args.length > 0) {
            for(String ssname: args) {
                for (Entry<String, String> entry : hmap.entrySet()) {
                    if (entry.getValue().contains(ssname)) {
                        ky      = entry.getKey();
                        valArr  = entry.getValue().split(":");
                        filtered.put(ky, valArr[0]+":"+ssname);
                    }
                }
            }
        }

        for (String iter: filtered.keySet()){
            String key = iter.toString();
            String value = filtered.get(key).toString();  
            System.out.println(key + "->" + value);
        }

    }
}

В аргументах я передаю: SSN1 SSN2 в аргументах. Результат должен быть

Table1->Table1:SSN1
Table2->Table2:SSN1
Table3->Table3:SSN1
Table5->Table5:SSN1
Table1->Table1:SSN2
Table2->Table2:SSN2
Table5->Table5:SSN2

Вместо этого я получаю результат:

Table2->Table2:SSN2
Table3->Table3:SSN1
Table5->Table5:SSN2
Table1->Table1:SSN2

Может ли кто-нибудь сообщить мне, в чем ошибка, которую я здесь делаю?

поскольку вы использовали карту для отфильтрованных данных, карта не допускает дублирования ключей .. это причина, по которой данные переопределяются

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

Ответы 3

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

Вы пытаетесь поместить несколько значений в Map, используя один и тот же ключ. Для каждого ключа карта может содержать только одно значение.

Следовательно, в конце будет видно только последнее значение, которое вы добавляете для любого заданного ключа.

Вообще говоря, ваш код предполагает, что строки не являются правильным типом данных для ваших данных и что вы должны хранить их в более структурированной форме (например, Map<String,List<String>>).

Есть ли способ передать вывод в два отдельных хэш-карты динамически? т.е. если у меня есть 2 аргумента, у меня должно быть соответственно 2 хэш-карты. Является ли это возможным ?

Metadata 23.05.2018 12:47

Конечно, можно создать список хэш-карт или даже хеш-карту хэш-карт. Я не уверен, поможет ли это решить вашу проблему, потому что не совсем понятно, что вы пытаетесь решить. Например, простая замена filtered.put на соответствующий System.out.println заставит ваш код «работать», но я не уверен, что вы этого хотите.

Joachim Sauer 23.05.2018 12:49

ОК. На данный момент, используя имена таблиц в Key и Values ​​и имена исходных систем в Value, я вычисляю количество записей как в исходной, так и в целевой таблицах. Но я получил требование сделать это для имен исходных систем, полученных из командной строки. Следовательно, я пытаюсь отфильтровать основную хеш-карту, чтобы получить имена таблиц, связанные с аргументами, полученными в новой хэш-карте, в том же формате, что и основная хеш-карта.

Metadata 23.05.2018 12:56

Я пытаюсь сделать это, так как могу просто отправить эту отфильтрованную коллекцию тому же методу, который вычисляет количество исходных и целевых таблиц, не меняя в нем какой-либо код. Надеюсь, это дало идею.

Metadata 23.05.2018 12:58

Как я заметил, ключ включен в значение ... так что вы можете использовать простой массив для целевых данных ... это может вам помочь

public static void main(String[] args) {
        String[] valArr;
        String ky;
        Map<String, String> hmap     = new HashMap<String, String>();
        List<String> filtered = new ArrayList<String>();

        hmap.put("Table1", "Table1:SSN1,SSN2,SSN3,SSN4,SSN5");
        hmap.put("Table2", "Table2:SSN1,SSN4,SSN2,SSN5,SSN8,SSN9,SSN10");
        hmap.put("Table3", "Table3:SSN4,SSN1");
        hmap.put("Table4", "Table4:SSN5,SSN6,SSN7");
        hmap.put("Table5", "Table5:SSN8,SSN1,SSN5,SSN2");

        if (args.length > 0) {
            for(String ssname: args) {
                for (Entry<String, String> entry : hmap.entrySet()) {
                    if (entry.getValue().contains(ssname)) {
                        ky      = entry.getKey();
                        valArr  = entry.getValue().split(":");
                        filtered.add(valArr[0]+":"+ssname);
                    }
                }
            }
        }

        for (String iter: filtered){
            System.out.println(iter.split(":")[0]+ "->" + iter);
        }

    }

Вам нужно перебрать элементы:

valArr  = entry.getValue().substring(entry.getValue().indexOf(":")).split(",");

Вот полный код, который дает желаемый результат:

public static void main(String[] args) {
    String[] valArr;
    String ky;
    Map<String, String> hmap     = new HashMap<String, String>();
    Map<String, String> filtered = new HashMap<String, String>();

    hmap.put("Table1", "Table1:SSN1,SSN2,SSN3,SSN4,SSN5");
    hmap.put("Table2", "Table2:SSN1,SSN4,SSN2,SSN5,SSN8,SSN9,SSN10");
    hmap.put("Table3", "Table3:SSN4,SSN1");
    hmap.put("Table4", "Table4:SSN5,SSN6,SSN7");
    hmap.put("Table5", "Table5:SSN8,SSN1,SSN5,SSN2");

    if (args.length > 0) {
        for(String ssname: args) {
            for (Entry<String, String> entry : hmap.entrySet()) {
                if (entry.getValue().contains(ssname)) {
                    ky      = entry.getKey();
                    valArr  = entry.getValue().substring(entry.getValue().indexOf(":")).split(",");
                    for (String val : valArr) {
                        if (val.equals(ssname)) {
                            filtered.put(ky, ky+":"+ssname);
                        }
                    }
                }
            }
        }
    }

    for (String iter: filtered.keySet()){
        String key = iter.toString();
        String value = filtered.get(key).toString();  
        System.out.println(key + "->" + value);
    }

}

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