代码之家  ›  专栏  ›  技术社区  ›  hanatic

在Java中计算数字键的值

  •  -2
  • hanatic  · 技术社区  · 2 年前

    作为我的应用程序的一部分,数据库在数据库中的用户记录中存储“徽章”。我使用位运算符,因为(据我所知)它们的两个加法不能有相同的解。以下是价值观:

    enum Badge {
            SUPPORTER(1),
            ALPHA(1 << 1),
            BETA_OWNER(1 << 2),
            BOOSTER(1 << 3),
            ONE_MONTH(1 << 4),
            THREE_MONTH(1 << 5),
            SIX_MONTH(1 << 6),
            ONE_YEAR(1 << 7),
            TWO_YEAR(1 << 8),
            ;
    
            public int value;
            
            public int resolve() {
                return value;
            }
    
            Badge(int i) {
                value = i;
            }
        }
    

    存储它们的方法非常简单,只需将用户对应的每个徽章的值相加即可。然而,解码这个值更为棘手。

    我该如何将数据库中的值解码成我可以操作的徽章列表?

    2 回复  |  直到 2 年前
        1
  •  2
  •   steffen    2 年前

    使用 EnumSet .枚举集只能保存每个项目一次(它是一个集合)。看一看 here 用于在数据库中存储值。有一些手动解码的解决方案,也可以使用Apache Commons。

        2
  •  0
  •   Shark    2 年前

    让我们试试这样:

    public enum BADGES {SUPPORTER, ALPHA, BETA_OWNER, BOOSTER, ONE_MONTH, THREE_MONTH, SIX_MONTH, ONE_YEAR, TWO_YEAR};
    
    public HashMap<BADGES, Integer> badgesToIntegerMap = /* initialize map where integers are mapped to badges */
    
    public HashMap<Integer, BADGES> integerToBadgesMap = /* initialize map where badges are mapped to their integers */
    
    public List<BADGES> getUserBadges(int userStatus) {
        List<BADGES> retVal = new ArrayList<BADGES>();
        // Start from highest one, being TWO_YEAR at time of writing
        int currentBadge = 1 << 8;  //
        while (currentBadge > 0) {  // These two should be replaced by iterating the badgesToIntegerMap's values
            if (userStatus && currentBadge == 1) {
                retVal.add(integerToBadgesMap.get(currentBadge));
            }
            currentBadge = currentBadge >> 1;
        }
        
        return retVal;
    }
    

    或者你知道,只需将这些整数传递给每个徽章的构造函数,就可以避免一次查找。