У меня есть хэш-карта, в которой есть ключ и значение в строке. Данные представлены в виде (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
Может ли кто-нибудь сообщить мне, в чем ошибка, которую я здесь делаю?




Вы пытаетесь поместить несколько значений в Map, используя один и тот же ключ. Для каждого ключа карта может содержать только одно значение.
Следовательно, в конце будет видно только последнее значение, которое вы добавляете для любого заданного ключа.
Вообще говоря, ваш код предполагает, что строки не являются правильным типом данных для ваших данных и что вы должны хранить их в более структурированной форме (например, Map<String,List<String>>).
Есть ли способ передать вывод в два отдельных хэш-карты динамически? т.е. если у меня есть 2 аргумента, у меня должно быть соответственно 2 хэш-карты. Является ли это возможным ?
Конечно, можно создать список хэш-карт или даже хеш-карту хэш-карт. Я не уверен, поможет ли это решить вашу проблему, потому что не совсем понятно, что вы пытаетесь решить. Например, простая замена filtered.put на соответствующий System.out.println заставит ваш код «работать», но я не уверен, что вы этого хотите.
ОК. На данный момент, используя имена таблиц в Key и Values и имена исходных систем в Value, я вычисляю количество записей как в исходной, так и в целевой таблицах. Но я получил требование сделать это для имен исходных систем, полученных из командной строки. Следовательно, я пытаюсь отфильтровать основную хеш-карту, чтобы получить имена таблиц, связанные с аргументами, полученными в новой хэш-карте, в том же формате, что и основная хеш-карта.
Я пытаюсь сделать это, так как могу просто отправить эту отфильтрованную коллекцию тому же методу, который вычисляет количество исходных и целевых таблиц, не меняя в нем какой-либо код. Надеюсь, это дало идею.
Как я заметил, ключ включен в значение ... так что вы можете использовать простой массив для целевых данных ... это может вам помочь
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);
}
}
поскольку вы использовали карту для отфильтрованных данных, карта не допускает дублирования ключей .. это причина, по которой данные переопределяются