为矩阵编写自定义格式的 toString 方法。需要它接受 Integer 或 Double

Writing a custom-formatted toString method for a matrix. Need it to accept either Integer or Double

提问人:Lapid Palid 提问时间:7/21/2023 最后编辑:Lapid Palid 更新时间:7/21/2023 访问量:46

问:

目前,输入仅限于 或 的形式。我知道这不是 的子类,当我尝试使用时,添加时会发生其他已知错误(即它们也不是超类和运行时添加问题)。是的,我可以制作该方法的两个副本,一个用于,一个用于,但由于其他原因,这很丑陋。同样,转换为数组或制作我自己的自定义矩阵类。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);
}
Java 泛型 输入 ArrayList 子类型

评论

0赞 Calabacin 7/21/2023
你提到 ArrayList<ArrayList> 两次,就好像他们在哪里做不同的事情一样。这可能是一个错误吗?
0赞 HomeworkHopper 7/21/2023
为什么不使用:ArrayList<?扩展 ArrayList<?扩展 Number>>
0赞 Andy Turner 7/21/2023
你应该把方法写成 accept ,而不是 ;因为几乎没有充分的理由将其限制为仅 ArrayList 而不是任何其他类型的 List。List<? extends List<? extends Number>>ArrayList
0赞 Andy Turner 7/21/2023
我真的不明白自定义格式方法的事情 - 你是想为和为做特定的事情,还是只是调用元素?(如果你只是调用 ,则无需限制为 和toStringIntegerDoubletoString()toString()IntegerDouble)
0赞 Lapid Palid 7/21/2023
@AndyTurner 是的,需要自定义格式化的 toString 方法,因为输出与默认的 toString 不同。但是不,它对 Double 和 Integer 都做同样的事情,即以所选格式打印它们。

答:

0赞 Tim Moore 7/21/2023 #1

您可以通过使用类型参数使方法泛型来解决此问题。下面是一个完整的示例: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 参数中删除,该方法将对数值类型具有相同的行为,同时也允许其他类型。matrixToStringObject.toString()extends Number

评论

0赞 Lapid Palid 7/21/2023
天哪,你是个男人!!谢谢!!!搞砸了通配符和泛型,但只是没有得到正确的组合,也不知道怎么做。这是一个巨大的帮助,我有几种方法可以从中受益,谢谢!!