如何遍历 java 中的 System.out.format 行?

How do I iterate through a System.out.format line in java?

我正在编写一个程序来查找双精度数组,假设它找到了:

double[] dubArray = {3.5,3.5,3.7,4.3,4.5,4.5,4.5,4.7,5.0,5.5,5.5};

然后创建一个计数器,它将打印从最低到最高的所有值

Array.sort(dubArray); //considering the array is out of order
int finalDub = dubArray.length;
double min = dubArray[0];
double max = dubArray[finalDub - 1];

for (double i = min; i < max; i += 0.1) {
   System.out.printf("%.1f %n", i );
} 

我需要让这段代码不仅打印值,还计算双精度数并在其前面放置一个“$”以显示双精度数在数组中的数量。

例如,我上面的代码会输出:

3.5
3.6
3.7
.
. 
.
5.3
5.4
5.5

但我需要它来输出:

3.5 $$
3.6
3.7 $
.
.
.
5.3 
5.4 
5.5 $$

我怎样才能使计数器能够迭代到 'System.out.printf("%.1f %n", i );' 行?

我更愿意将 $ 计数器合并到 System.out.printf 行中,而不是使用字符串生成器或其他东西,但如果不能完成,那就不能完成。

double[] dubArray = {3.5, 3.5, 3.7, 4.3, 4.5, 4.5, 4.5, 4.7, 5.0, 5.5, 5.5};

// O(nlogn)
Map<Double, Integer> treeMap = new TreeMap<>();
Arrays.stream(dubArray).forEach(d -> treeMap.put(d, treeMap.getOrDefault(d, 0) + 1));

// O(n)
StringBuilder sb = new StringBuilder();
treeMap.forEach((d, f) -> {
    sb.setLength(0);
    while (f-- > 0) {
        sb.append("$");
    }
    System.out.println(d + " " + sb);
});

将元素添加到 TreeMap(我的方法而不是排序),键作为元素,值作为频率。

再次迭代TreeMap,根据频率值生成$字符串并打印结果。

// Output
3.5 $$
3.7 $
4.3 $
4.5 $$$
4.7 $
5.0 $
5.5 $$

您并不总是需要构建 $ 字符串。您还可以将其存储到 HashMap.

Map<Integer, String> dollarSignMap = new HashMap<>();

StringBuilder sb = new StringBuilder();
treeMap.forEach((d, f) -> {
    if (dollarSignMap.containsKey(f)) {
        System.out.println(d + " " + dollarSignMap.get(f));
    } else {
        sb.setLength(0);
        while (f-- > 0) {
            sb.append("$");
        }
        dollarSignMap.put(f, sb.toString());
        System.out.println(d + " " + sb);
    }
});

除了 Harshal Parekh 的回答:如果你想使用 System.out.printf,你可以使用 String.repeat 而不是 while 循环和 StringBuilder:

System.out.printf("%.1f %s%n", i, "$".repeat(count));

要计算计数值,您可以使用一个简单的 for 循环:

int count = 0;
for (double v : dubArray) {
    if (Math.abs(i - v) < 1e-5) {
        count++;
    }
}

使用 Math.abs(i - v) < 1e-5 引入了一些数值容差,这对于双打总是一个好主意。请注意,使用 for 循环是低效的,并且有更快的方法,例如像 Harshal Parekh 的回答中那样使用哈希映射。