2015-12-08 105 views
0

我们将星期几表示为整数。java将映射位映射到字符串

1 = sunday 
2 = monday 
4 = tuesday 
8 = wednesday 
16 = thursday 
32 = friday 
64 = saturday 

当我们拿到一个int 88 - 这将意味着64 + 16 + 8,所以我们需要得到调度是周三,周四&星期六

我做了如下但是我想有一个更好的办法...

public List<String> getDays(int input) { 
    List days = new ArrayList(); 
    days.add((sunday & input!=0) ? "SUN" : ""); 
    days.add((monday & input!=0) ? "MON" : ""); 
    ... 
    ... 
    return days; 
} 
+4

你想你列表中的一堆空白条目?这就是你现在得到的。 –

+1

您可以创建一个位(整数)到日(字符串)的映射,并遍历映射的条目,添加在输入中有位的日子。或者,您可以创建一个包含这些映射的枚举以实现更多面向对象的方法。 – Vulcan

+2

您可能想要检查堆栈交换中的codereview社区是否是一个提问此问题的好地方(只要您当前的代码正在执行预期的操作) – Marged

回答

0

只需使用含天一个循环数组。

public static void main(String[] args) { 
    System.out.println(getDays(88)); // [WED, THU, SAT] 
} 

public static List<String> getDays(int input){ 
    List<String> days = new ArrayList<String>(); 
    String[] daysArr = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; 
    for (int i = 0 ; i < 7 ; i++){ 
     if ((input & 1 << i) != 0){ 
      days.add(daysArr[i]); 
     } 
    } 
    return days; 
} 
+2

为什么不使用'1 << i'而不是'(int)Math.pow(2,i)'?你应该避免浮点运算 –

+0

@hege_hegedus这是一个很好的!将编辑我的帖子。谢谢你 –

0

你可以用你的电话号码的二进制表示玩:88是二进制1011000,所以只勾选设置为“一”位并打印星期的对应日

static void checkNumber(int x){ 
    BigInteger bigX=BigInteger.valueOf(x); 
    if(bigX.testBit(0)) 
     System.out.println("sunday"); 
    if(bigX.testBit(1)) 
     System.out.println("monday"); 
    if(bigX.testBit(2)) 
     System.out.println("tuesday"); 
    if(bigX.testBit(3)) 
     System.out.println("wednesday"); 
    if(bigX.testBit(4)) 
     System.out.println("thursday"); 
    if(bigX.testBit(5)) 
     System.out.println("friday"); 
    if(bigX.testBit(6)) 
     System.out.println("saturday"); 
}