我试图从0到 n 计数,并用二进制表示值。使用Java,使用Integer.toBinaryString()很容易。但是,我想以1的数量级生成输出。例如,计数0到7:
[000, 001, 010, 100, 011, 101, 110, 111]
在我正在解决的问题的背景下,在“类”(一个1,两个1等)中进行排序有点无关紧要。所以011,101,110可以是110,011,101。
而不是以下,这是计数0到7的结果,并获得二进制字符串:
[000, 001, 010, 011, 100, 101, 110, 111]
我似乎无法围绕如何处理这个问题。
答案 0 :(得分:4)
您搜索的是Integer.bitCount(i)
(自Java 1.5起可用),返回一位数。
使用Java 8,您可以将数字存储到数组中,然后按bitCount
升序对其进行排序:
Integer[] numbers = new Integer[8];
for (int i = 0; i < 8; i++) numbers[i] = i;
Arrays.sort(numbers, Comparator.comparingInt(Integer::bitCount));
System.out.println(Arrays.toString(numbers));
或者如果您想使用Java 8 Streams:
List<Integer> numbers = IntStream.range(0, 8)
.boxed()
.sorted(Comparator.comparingInt(Integer::bitCount))
.collect(Collectors.toList());
System.out.println(numbers);
如果你不能使用Java 8,那么Comparator
稍微复杂一些:
for (int i = 0; i < 8; i++) numbers[i] = i;
Arrays.sort(numbers, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.bitCount(o1)-Integer.bitCount(o2);
}
});
System.out.println(Arrays.toString(numbers));
答案 1 :(得分:0)
当您说要订购输出时,似乎这意味着您要对其进行排序。这可以通过多种方式完成,但最终归结为编写Comparator
。
以下是使用bitCount
的示例:
import java.util.*;
import java.util.stream.*;
import static java.util.stream.Collectors.*;
class Example {
public static void main(String[] args) {
Set<Integer> set =
new TreeSet<>(Comparator.comparingInt(Integer::bitCount)
.thenComparing(naturalOrder()));
IntStream.rangeClosed(0, 7)
.forEach(set::add);
String s = set.stream()
.map(Integer::toBinaryString)
.collect(joining(", ", "[", "]"));
// [0, 1, 10, 100, 11, 101, 110, 111]
System.out.println(s);
}
}