提问人:Lapid Palid 提问时间:7/21/2023 最后编辑:Lapid Palid 更新时间:7/21/2023 访问量:46
为矩阵编写自定义格式的 toString 方法。需要它接受 Integer 或 Double
Writing a custom-formatted toString method for a matrix. Need it to accept either Integer or Double
问:
目前,输入仅限于 或 的形式。我知道这不是 的子类,当我尝试使用时,添加时会发生其他已知错误(即它们也不是超类和运行时添加问题)。是的,我可以制作该方法的两个副本,一个用于,一个用于,但由于其他原因,这很丑陋。同样,转换为数组或制作我自己的自定义矩阵类。ArrayList<ArrayList<Integer>>
ArrayList<ArrayList<Double>>
ArrayList<Integer>
ArrayList<Number>
ArrayList<?>
ArrayList<? extends Number>
ArrayList<ArrayList<Integer>>
ArrayList<ArrayList<Double>>
我看过很多关于这个问题的帖子,但除了重写大部分代码之外,在任何地方都没有解决方案。对于如何编写一个可以接受这两个作为输入的方法,Java 中有什么简单的答案吗?
我已经尝试了我能想到的一切。这就是我来这里的原因。我什至无法创建一个帮助程序方法来分解内部 ArrayLists,因为该方法本身必须接受上述输入之一。
当前代码(如果有帮助):
static String integerMatrixToString(ArrayList<ArrayList<Integer>> matrix) {
ArrayList<String> s = new ArrayList<>();
for (int j = 0; j < matrix.get(0).size(); j++) {
ArrayList<Integer> n = new ArrayList<>();
for (int i = 0; i < matrix.size(); i++) {
n.add(matrix.get(i).get(j));
}
s.add(myArrayListToString(n, ParseType.EMPTY_EMPTY_SPACE));
}
return myArrayListToString(s, ParseType.EMPTY_EMPTY_NEWLINE);
}
答:
您可以通过使用类型参数使方法泛型来解决此问题。下面是一个完整的示例:N extends Numeric
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class NumberFormatter {
public static void main(String[] args) {
List<List<Integer>> intMatrix = List.of(
List.of(1, 2),
List.of(3, 4)
);
/*
* 1 3
* 2 4
*/
List<List<Double>> doubleMatrix = List.of(
List.of(5.6, 7.8),
List.of(9.0, 1.2)
);
/*
* 5.6 9.0
* 7.8 1.2
*/
System.out.println(matrixToString(intMatrix));
System.out.println(matrixToString(doubleMatrix));
}
static <N> String matrixToString(List<? extends List<N>> matrix) {
List<String> s = new ArrayList<>();
for (int j = 0; j < matrix.get(0).size(); j++) {
List<N> n = new ArrayList<>();
for (int i = 0; i < matrix.size(); i++) {
n.add(matrix.get(i).get(j));
}
s.add(myArrayListToString(n, ParseType.EMPTY_EMPTY_SPACE));
}
return myArrayListToString(s, ParseType.EMPTY_EMPTY_NEWLINE);
}
private static String myArrayListToString(List<?> nums, ParseType parseType) {
return nums.stream()
.map(Object::toString)
.collect(Collectors.joining(parseType.delimiter));
}
private enum ParseType {
EMPTY_EMPTY_NEWLINE("\n"), EMPTY_EMPTY_SPACE(" ");
private final String delimiter;
private ParseType(String delimiter) {
this.delimiter = delimiter;
}
}
}
请注意,在输出中转置矩阵的行为是在提供的原始代码中,因此我认为这是故意的,并保留了这种行为。
此外,此实现中没有任何内容实际上要求矩阵中的数据是数字,因为对每个单元格调用的唯一方法是 。如果您希望在矩阵中允许任何类型的数据,只需从 type 参数中删除,该方法将对数值类型具有相同的行为,同时也允许其他类型。matrixToString
Object.toString()
extends Number
评论
List<? extends List<? extends Number>>
ArrayList
toString
Integer
Double
toString()
toString()
Integer
Double
)