Java сложные карты? - PullRequest
       93

Java сложные карты?

0 голосов
/ 26 апреля 2020

Извините, но я не могу придумать другие названия для моего вопроса. Я пишу программу на Java, с большим количеством различных переменных. Поэтому я решил использовать HashMaps (или в общих картах). Но я не знаю так много о сложных картах в Java. Я знаю только "HashMaps" и как их использовать. Вот два разных HashMaps, которые я могу использовать:

public class Storage {
public static HashMap<String, Boolean> user = new HashMap<>();
public static HashMap<Integer, Double> money = new HashMap<>();
}

Итак, теперь это немного сбивает с толку. Итак, как вы можете видеть, есть 2 HashMaps. В первом HashMap есть Значение для каждого ключа true или false.

public class test {
String s = "Tester";
  public void on() {
  if(Storage.user(s) == true) {
  //That part will be my question
   }
 }
}

Итак, если значение данной String равно true, должен быть дополнительный HashMap, как в классе Storage. Но я имею в виду, что для каждой строки должен быть (если это правда) HashMap, и они не должны совместно использовать одну карту. Как я уже сказал, я не очень много знаю о картах и, возможно, HashMaps полностью ложны. Если так, извините. Надеюсь, вы понимаете мою проблему и знаете подходящее решение

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Если вы хотите отдельную Map<Integer, Double> для каждого пользователя, как указано String, то создайте Map<String, Map<Integer, Double>>.

. Вам не нужна карта для Boolean, потому что вы можете проверить существование пользователя, используя containsKey(), или просто получить значение внешней карты и проверить null.

class Storage {
    public static Map<String, Map<Integer, Double>> user = new HashMap<>();
}
Map<Integer, Double> money = Storage.map.get(userName);
if (money != null) {
    // code here
}

ОБНОВЛЕНИЕ

Когда вы строите карту, используйте методы computeIfAbsent() и merge(), например:

class Storage {
    public static Map<String, Map<Integer, Double>> user = new HashMap<>();

    public static void addUserMoney(String userName, int moneyKey, double amount) {
        user.computeIfAbsent(userName, k -> new HashMap<>())
            .merge(moneyKey, amount, Double::sum);
    }
}

Тест

Storage.addUserMoney("John", 1, 9.95);
Storage.addUserMoney("Jane", 3, 3.75);
Storage.addUserMoney("John", 1, 4.25);
System.out.println(Storage.user);

Выход

{John={1=14.2}, Jane={3=3.75}}
1 голос
/ 26 апреля 2020

Что вам нужно, так это карта карт.

Map<String, Map<Integer,Double>> map = new HashMap<>();

Затем вы можете просто указать значение String, которое является истинным.

Примеры:

Map<String, Map<Integer,Double>> map = new HashMap<>();

Следующее:

Map.computeIfAbsent(Key, (a)->new HashMap<>()).put(i, d);

Ведет себя так же, как

Map<Integer,Double> innerMap = map.get(Key);
if (innerMap == null) {
     innerMap = new HashMap<>();
     map.put(Key, innerMap)
}
innerMap.put(i, d);

Назначение некоторых значений


map.computeIfAbsent("A", (a)->new HashMap<>()).put(10,20.56);
map.computeIfAbsent("A", (a)->new HashMap<>()).put(20,4.2);
map.computeIfAbsent("A", (a)->new HashMap<>()).put(30,10.6);

map.computeIfAbsent("B", (a)->new HashMap<>()).put(1,2.);
map.computeIfAbsent("B", (a)->new HashMap<>()).put(2,2.44);
map.computeIfAbsent("B", (a)->new HashMap<>()).put(10,2.45);

map.computeIfAbsent("C", (a)->new HashMap<>()).put(30,3.2);

Печать всех значений

map.entrySet().forEach(System.out::println);

Чтобы получить спецификацию c Значение

double d = map.get("A").get(10); // gets 20.56 from Map "A"
System.out.println(d); 

Если вы уже знаете, что внутренняя карта связана с ключом, вы можете просто сделать следующее:

// gets the map at "C"
// and puts 44.7 at key 44
map.get("C").put(44,44.7);

...