17

I've run into a problem I haven't had to deal with before. I'm writing a patch for a database in java that's basically converting data stored in certain rows. In order to do this I have a conversion table that tells me what values become what.

Example, if I read in either "RC", "AC", "GH" -> Update the value to "T1". (These are just random examples, it's basically converting one string to another.)

I need a good way of storing these conversions. I was thinking a hashmap: KEY,VALUE: (RC,T1) (AC,T1) (GH,T1) and so on and so on.

Now, there's dozens and dozens of these. What's a good clean way of populating this hashmap when the patch initializes?

user1652875
  • 233
  • 1
  • 3
  • 7

4 Answers4

38

I would do the initialisation while setting up the HashMap

For example

private static final Map<String, String> m = new HashMap<String, String>() {{
    put("RC", "T1");
    put("AC", "T1");
}};

Then you wuld make sure that everything is set up together in your code.

I think @Nambari makes a good point though with perhaps having the value as a list rather than just a string. This does then swap your keys and values though.

eg

 private static final Map<String, List<String>> m = new HashMap<String, List<String>>() {{
    put("T1", Arrays.asList("RC", "AC");
}};
RNJ
  • 15,272
  • 18
  • 86
  • 131
  • Thanks! That's kind of what I was thinking (your first example). I was hoping there might be a really tidy way of doing it but I guess I'm going to have to get down and dirty. Greatly appreciated RNJ for confirming. – user1652875 Sep 06 '12 at 18:57
  • @user1652875 I think it's slightly tidier having the initialisation in the same place as the declaration. Then you know for sure the map does contain some data. – RNJ Sep 06 '12 at 20:33
  • 5
    **Warning**: Do not use the "double brace initializer", it creates an anonmous subclass of `HashMap`, which may potentially result in a performance hit. Second, this is confusing to the reader, since this code suggests that there is some "double brace initializer" construct, while there is none. – MC Emperor May 07 '19 at 08:59
3

With Java 11 you can use Map.of("RC", "T1", "AC", "T1");

Ondřej Stašek
  • 761
  • 6
  • 15
0

May be other way, List RC,AC,GH as value and T1 as key for hashmap, this way you can reduce number of entries in map.

kosa
  • 65,990
  • 13
  • 130
  • 167
  • But, complexity of a lookup in such structure won't be any good - how would you search such map then, say when looking up for a replacement for "RC"? – david a. Sep 06 '12 at 18:43
  • I agree, this is simple approach if you have less keys (like T1,T2 etc.,). If less keys you can get entrySet() and play with it. If number of keys also high, then lookup time would be high. Again, it is trade-off, simplicity at one place creates complexity on other end. – kosa Sep 06 '12 at 18:46
0

You can use PropertiesConfiguration from apache commons.

value can contain value delimiters and will then be interpreted as a list of tokens. Default value delimiter is the comma ','. So the following property definition

key = This property, has multiple, values
Amit Deshpande
  • 19,001
  • 4
  • 46
  • 72