Looking to associate strings to ints in a cleaner/more efficient way

前端 未结 8 966
孤街浪徒
孤街浪徒 2021-01-07 07:06

How can I improve this?

The relationship is one to one and continuous on [-1,5] so i was thinking of using enum, but I\'m not sure how to compare a string value to

相关标签:
8条回答
  • 2021-01-07 07:33

    Honestly, I wouldn't worry about keeping something like this ultra efficient, but there is a change you could make. If the word you pass is the last word you check for then your program ends up performing all of the checks in your function. This shouldn't be a problem in this case, but generally you don't want to flood your program with if statements, especially if you have a lot of cases.

    Use a hashtable and just insert pairs. This way, all of your evaluateWord calls will return in amortized constant time. :)

    Good luck!

    0 讨论(0)
  • 2021-01-07 07:34

    This is what a map is for;

    Create a HashMap, add key and values to the map like

    wordMap.put("program", Integer.valueOf(1));
    

    ....

    then, to get the value do

    Integer val = wordMap.get(sval);
    
    0 讨论(0)
  • 2021-01-07 07:34

    You could just use an array or hashmap to map the enum values to the string values.

    0 讨论(0)
  • 2021-01-07 07:35

    Inspired by your enum comment, I present the following. It's a bit hackish, but:

    enum Word
    {
        PROGRAM (1), BEGIN (2), END (3), INT (4), IF (5);
    
        public int value;
    
        public Word (int value)
        {
            this.value = value;
        }
    };
    
    int evaluateWord (String word)
    {
        return Word.valueOf(word.toUpperCase( )).value;
    }
    

    I love Java enums because you can do things like this. This is especially useful if you later want to (for example) add a unique behaviour for each word, or to maintain a long list of words. Note though that it is case insensitive.

    Or, alternately:

    enum Word
    {
        PROGRAM, BEGIN, END, INT, IF;
    };
    
    int evaluateWord (String word)
    {
        return Word.valueOf(word.toUpperCase( )).ordinal( ) + 1;
    }
    
    0 讨论(0)
  • 2021-01-07 07:50

    Using an enumeration:

    enum Word {
      PROGRAM(1,"program"),
      BEGIN(2,"begin"),
      END(3,"end"),
      INT(4,"int"),
      IF(5,"if");
    
      private final int value;
      private final String representation;
    
      Word(int value, String representation)
      {
        this.value = value;
        this.representation = representation;
      }
    
      public int value()
      { return value; }
    
      private static Map<String, Word> fromRep =
        new HashMap<String, EnumExample2.Word>();
    
      public static Word fromRepresentation(String rep) {
        if (!validRep(rep)) {
          throw new IllegalArgumentException("No rep: "+rep);
        }
    
        return fromRep.get(rep);
      }
    
      public static boolean validRep(String rep)
      { return fromRep.get(rep) != null; }
    
      static {
        for (Word word : Word.values()) {
          fromRep.put(word.representation, word);
        }
      }
    }
    

    Then your logic is:

    private int evaluateWord(String sval) {
      if (!Word.validRep(sval)) {
        System.exit(0);
      }
    
      return Word.fromRepresentation(sval).value();
    }
    
    0 讨论(0)
  • 2021-01-07 07:50

    A hashmap could work:

    private static HashMap<String, Integer> lookup = new HashMap<String, Integer>();
    static {
        lookup.put("program", 1);
        lookup.put("being", 2);
        lookup.put("end", 3);
        lookup.put("int", 4);
        lookup.put("if", 5);
    }
    
    private int evaluateWord(String sval) {
        if ( lookup.containsKey(sval) ) {
            return lookup.get(sval);
        }
        System.exit(0); 
    }
    
    0 讨论(0)
提交回复
热议问题