【问题标题】:Calculating number bonds to value in Java在Java中计算数字键值
【发布时间】:2022-04-12 01:26:16
【问题描述】:

作为我的应用程序的一部分,数据库将“徽章”存储在数据库中用户的记录中。我使用按位运算符(据我所知)没有两个加法可以有相同的解决方案。以下是值:

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;
        }
    }

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

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

    标签: java math bitwise-operators


    【解决方案1】:

    使用EnumSet。EnumSet 只能容纳每个项目一次(它是一个集合)。看看here 在数据库中存储值。有手动解码的解决方案,或者您可以使用 Apache Commons。

    【讨论】:

      【解决方案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;
      }
      

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

      【讨论】:

      • 我不会为初始化这两个地图的样板代码而烦恼。
      • 哦,自从我输入问题以来,问题已更改为在枚举的构造函数中包含数字,太好了。您仍然需要使用查找图并找出您的号码中的内容。意思是“在您的号码中设置了哪些位,并将其转换为徽章列表”
      • 感谢您的贡献,非常有帮助!我决定改用 steffen 的解决方案,因为它更好地满足了我的需求。
      • @hanatic 是的,更容易但增加了更多(可能不必要的)依赖项。你的来电。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多