Java的:创建使用HashMap的或其他一些Java集合的查找表?(java: create a

2019-07-18 01:54发布

扩展这个问题 ,我已经接受了答案,说使用查找表或HashMap中针对这种情况,因为这将是一个更好的结构来处理多个条件

当前的结构。

类来存储消息。

    public class ProgressMessages 
    {
     public static String msg1="Welcome here .....";
     .
     .
     .
     //around 100 more similar static variables.
    }

条件,并从上面的类显示适当的消息。

    int x=calculatedVal1(m,n); 
    int y=calculatedVal2(o,q);

    SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date d=new Date();
    String s=formater.format(d);

    try {
          long d1 = formater.parse("2013-01-10 13:53:01").getTime();
          long d2=formater.parse(s).getTime();
          totaldays=Math.abs((d1-d2)/(1000*60*60*24));
         } catch (ParseException e) {
            e.printStackTrace();
         }

    if(totaldays<7&&x<20)
     {
      System.out.println("my message...1"+ProgressMessages.msg1); 
     }

    else if(totaldays<7&&x>10&&y<20)
    {
      System.out.println("my message...2"+ProgressMessages.msg2);
    }   
    ....
    //obvioulsy 100 more else-if's to display 100 messages.

其实我想知道怎么会在这种情况下,查找表的帮助?

究竟应该如何在Java中的Hashmap实现/哈希表等,这将是有利的怎么样?

- - 编辑 - -

我被@assylias前面回答去,因为它是更清洁的申请。 但是,如果我用枚举,然后我有一个修复。

为了描述大图...

即邮件列表是像...

1) “欢迎” + nameOfUser + “你的成功率是” + succssRate + “%” +以前它是较早+ + “%”。

2) “哦,是的。” + succssRate + “%” +从早前+ + “%” 提高。

3)“现在你应该专注于” + exerCiseName。

我怎么能做到这一点使用枚举,因为它有固定的字符串数据。 我可以做不同的构造? 与编辑代码assylas任何例如如何回答呢?

Answer 1:

我会用一个

Map<Criteria, Message> lookupTable;

其中, Criteria是你写一个类(和重写equals()hashCode() ),代表标准来选择的消息。

Message也是你写一个类,它封装了实际的消息String ,但也为您提供了一些功能来设置变量。

有了这个解决方案,你必须在你的程序开始时初始化一次地图,并可以随时使用它是这样的:

Criteria criteria = ... // gather your criteria somehow
Message msg = lookupTable.getMessage(criteria);
// use your variable setting methods here
String message = msg.toString();


Answer 2:

你可以使用一个枚举,假设消息列表在编译时是已知的。 优点是每一个消息现在是持有其状态,并调用代码会简单得多负责。

public enum Message {

    MESSAGE1("Welcome") {
        @Override
        boolean isApplicable(long totalDays, int x, int y) {
            return totalDays < 7 && x < 20;
        }
    },
    MESSAGE2("Bye bye") {
        @Override
        boolean isApplicable(long totalDays, int x, int y) {
            return totalDays < 7 && x > 10 && y < 20;
        }
    };

    private String msg;

    Message(String msg) {
        this.msg = msg;
    }

    abstract boolean isApplicable(long totalDays, int x, int y);

    public static String lookupMessage(long totalDays, int x, int y) {
        for (Message m : Message.values()) {
            if (m.isApplicable(totalDays, x, y)) {
                return m.msg;
            }
        }
        throw new IllegalArgumentException();
    }
}

现在,在您调用代码,没有更多的if / else如果代码只需一行:

System.out.println(Message.lookupMessage(1, 2, 3));

注1:这是不是作为查找复杂度为O(n)的操作使用地图一样高效,但由于n为100左右,它不应该是一个显著的性能损失。 而且它比其他的答案提出的解决方案更具可读性和可维护性。

注2:你甚至可以把条件/平面文件的消息,在运行时读取文件,并使用脚本引擎在运行时EVAL每个条件。 这将是稍微慢一些(但我们在这里所说的子毫秒),但会从你的代码中删除所有的混乱,并把它放在一个配置文件。



Answer 3:

如果你有这么多的情况下,你不能避免把这些条件的一些在代码。 使用查找表的优点是1)易于实现。 2)Flexible.If你想改变未来的一些消息的价值,你可以去looktable类和变化。



文章来源: java: create a lookup table using hashmap or some other java collection?