Haluan lisätä arvoja HashMap -tietoon, jota käytettäisiin sama luokka. Minulla on kaksi ratkaisua:

  1. Kaikkien arvojen lisääminen static
  2. Kun ensimmäinen menetelmä kutsutaan, lisää arvot

Ratkaisu 1:

private static Map<Character, String> codes = new HashMap<>(); static { codes.put("A", ".-"); codes.put("B", "-..."); codes.put("C", "-.-."); codes.put("D", "-.."); codes.put("E", "."); codes.put("F", "..-."); // ... } 

Ratkaisu 2:

boolean methodIsCalled = false; public static char decode(String s) { if(!methodIsCalled) { addValues(); methodIsCalled = true; } // ... } private static void addValues() { codes.put("A", ".-"); codes.put("B", "-..."); codes.put("C", "-.-."); codes.put("D", "-.."); codes.put("E", "."); codes.put("F", "..-."); // ... } 

Mikä on tehokkain? Mikä on paras käytäntö?

Kommentit

  • Miksi laitat sen ensin HashMapiin? Miksi ei 26 merkkijonoa?
  • Miten 26 merkkijonon ryhmä ratkaisee tämän ongelman? Erityisesti, miten teet kartoituksen? Sinulla on mielessä implisiittinen muunnos A: sta – > 0, B – > 0, …?
  • @Ali viimeinen ryhmä käsittelee muuttumattomuutta ja inicialisointia. A- > 0, B- > 1 tekee siitä melko hienon välttämällä monia muita tarvittavien kirjastojen muita kysymyksiä, ylimääräisiä staattisia lohkoja tai rakentajat. Se ' on selkeä ja kohtuullinen.
  • @MichaelT Ehkä tässä nimenomaisessa esimerkissä, kun otetaan huomioon, että käyttäjä haluaa kartoituksen morse-koodille, jonolle koko 26 on hieno, se ei kuitenkaan ole yleinen ratkaisu. Vastaukseni oli kohti yleistä ratkaisua, ei tätä erityistä. Monissa tapauksissa verkkotunnus on niin suuri, että emme voi käyttää suoraa kartoitusta kokonaislukuihin ja meidän on käytettävä hashmapia.
  • @MichaelT btw, taulukko on vain kokoluokittain muuttumaton, mutta voit muuttaa yksi sen elementeistä. a [0] = " uusi val ".

Vastaa

Ratkaisusi 1 voi olla ongelmallinen, koska hashmap on staattinen ja se alustetaan vain kerran ja se jaetaan kaikille luokan jäsenille. Onko tämä tarkoitettua käyttäytymistäsi vai haluatko, että jokaisella esiintymällä on oma kartta? Jos sinulla on vain yksi kartta, ehdotan, että välität joukon rakentajalle staattisen sijasta, esimerkiksi:

public class Data { private final Map<Character, String> codes; public Data(Map<Character, String> codes) { this.codes = codes} } 

Ratkaisusi 2 lisää sarjan laiskan aloituksen yleiskustannukset aina, kun tarvitset sitä, ja lisää ruman tarkistuksen methodIsCalled ohjelman logiikkaan. Mielestäni kartan alustaminen konstruktorissa on parempi vaihtoehto.

public class Data { private final Map<Character, String> codes; public Data() { this.codes = new HashMap<>(); codes.put("A", ".-"); codes.put("B", "-..."); codes.put("C", "-.-."); codes.put("D", "-.."); codes.put("E", "."); codes.put("F", "..-."); } } 

Toinen kysymys, johon sinun on vastattava, on, että jos muutat tämän hashmapin arvoja myöhemmin tai ei. Jos et muuta sitä, sinun kannattaa etsiä muuttumattomia hashMaps-karttoja. Yksi vaihtoehto on käyttää Collections.unmodifiableMap (kartta) -ohjelmaa.

Voit myös käyttää Google Guava -kirjastoja, jotta voit alustaa kartan yksi rivi ja hanki muuttumaton kartta:

ImmutableMap.<Character, String>builder() .put("A", ".-") .put("B", "-...") .put("C", "-.-.") .put("D", "-..") .put("E", ".") .put("F", "..-.") .build(); 

vastaus

Mikään ei voi voittaa Guavan ImmutableMap optimoidulla muistinkulutuksella, mutta tässä on pari puhdasta ratkaisua:

/* Name of the class has to be "Main" only if the class is public. */ class Ideone { private static final Map<Character, String> codes1; static { Map<Character, String> temp= new HashMap<Character, String>(); temp.put("A", ".-"); temp.put("B", "-..."); temp.put("C", "-.-."); temp.put("D", "-.."); temp.put("E", "."); temp.put("F", "..-."); // ... codes1 = Collections.unmodifiableMap(temp); } private static final Map<Character, String> codes2 = Collections.unmodifiableMap(new HashMap<Character, String>() { { put("A", ".-"); put("B", "-..."); put("C", "-.-."); put("D", "-.."); put("E", "."); put("F", "..-."); // ... } }); } 

Vastaa

Jos et vaadi laiskaa alustusta (ja pientä, kasvamatonta karttaa, jossa on 26 kohdetta, ei pidä ”), niin miksi et optimoisi sen sijaan, että luettavuus olisi parempi? Käytän aina jotain

private static Map<Character, String> codes = newMap( "A", ".-", "B", "-...", "C", "-.-.", ... ); 

(sopivasti määritellyllä aputoiminnolla newMap).

Kommentit

  • Voitteko jopa kirjoittaa newMap-parametripaketteja?
  • @ VF1 Voit, jos määrität sen yleiseksi funktioksi, jossa on varargit .

vastaus

Näissä tapauksissa luulen, että kysymys ei ole tehokkaasta menetelmästä – vaan pikemminkin milloin todellakin tarvitsevat kartan alustuksen ja valmiuden.

staattisen alustuksen tapauksessa – aikaluokan latautumisen jälkeen

Laiska latausmenetelmäsi saattaa olla tarpeen, jos sinun on asetettava ”valtava” ”karttaa, ja sanotaan usein, että nämä arvot tulevat kalliista lähteistä (ts. verkon yli), vaikka et tarvitse ulkoista lippua.

Collection.isEmpty () kertoo, onko se jo alustettu tai ei (edellyttäen, että tietenkin ainakin yksi arvo olisi alustettava)

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *