如何遍历 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 的回答中那样使用哈希映射。
我正在编写一个程序来查找双精度数组,假设它找到了:
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 的回答中那样使用哈希映射。