有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将InputStream作为输入的对象方法转换为数组以进行打印

我有一个方法来读取一个整数数组,它是一个类,输入是InputStream。我尝试使用scanner,但我一直在填充数组并创建return语句以正确的方式输出它。我真的很想知道转换应该如何工作这是我第一次面对这种问题,因为我对Java非常陌生,所以请对我放松点。到目前为止我得到的是:

public class ArrayReader {

    public static IntegerArray readIntArray(InputStream input) {
        Scanner scanner = new Scanner(input);
        scanner.nextInt();
        int size = 0;
        int[] iarr;
        while(scanner.hasNextInt()) {
            size++;
            scanner.nextLine();
        }
    }
}


import java.util.Arrays;

public final class IntegerArray {
    private int[] a;

    public IntegerArray(int[] a) {
        this.a = a;
    }

    public int length() {
        return a.length;
    }

    public int getElementAt(int i) {
        return a[i];
    }

    public int sum() {
        int sum = 0;
        for(int i: a) {
            sum += i;
        }
        return sum;
    }

    public double average() {
        int i, sum = 0, armean;
        for(i = 0; i < a.length; i++) {
            sum = sum + a[i];
        }
        armean = sum / i;
        return armean;
    }

    public IntegerArray getSorted() {
        int[] b = a.clone();
        Arrays.sort(b);
        return new IntegerArray(b);
    }

    public IntegerArray contact(IntegerArray ia) {
        int[] newA = new int[a.length + ia.length()];
        for(int i = 0; i < ia.a.length; i++) {
            newA[i] = a[i];
        }

        for(int j = 0; j < ia.a.length; j++) {
            newA[j + a.length] = ia.a[j];
        }

        return new IntegerArray(newA);
    }

    @Override
    public String toString() {
        return a.toString();
    }


}

共 (2) 个答案

  1. # 1 楼答案

    使用Java 8,您可以这样编写方法

    public class ArrayReader {
    
        public static IntegerArray readIntArray(InputStream input) {
            Scanner scanner = new Scanner(input);
            List<Integer> intList = new ArrayList<Integer>();
            while (scanner.hasNextInt()) {
                intList.add(scanner.nextInt());
            }
            scanner.close();
    
            return new IntegerArray(intList.stream().mapToInt(Integer::intValue).toArray());
        }
    
        public static void main(String args[]) throws Exception {
            FileInputStream fin = new FileInputStream("num.txt");
            IntegerArray integerArray = readIntArray(fin);
            System.out.println(integerArray.sum());
            System.out.println(integerArray.average());
            fin.close();
        }
    }
    

    在当前目录中创建一个文件名为num.txt的文本文件,在其中输入一些数字,运行代码并享受输出

    编辑:

    解释这句话

    IntegerArray(intList.stream().mapToInt(Integer::intValue).toArray());
    

    IntegerArray类声明了一个接受本机int数组的构造函数,如下所示

    public IntegerArray(int[] a) {
        this.a = a;
    }
    

    但是读取的数字存储在List<Integer>对象中,因此该列表需要转换为int[],这就是

    intList.stream().mapToInt(Integer::intValue).toArray()
    

    这是需要的

    它基本上是从intList创建一个流,然后mapToInt(Integer::intValue)方法将整数对象流转换为本机整数流,最终使用toArray()方法收集为int[],这是我们根据构造器需要获得的

    如果您使用这样的包装整数类声明了构造函数

    public IntegerArray(Integer[] a) {
        this.a = a;
    }
    

    那么我们就可以通过写这个来实现

    new IntegerArray(intList.toArray(new Integer[intList.size()]))
    

    希望有帮助

  2. # 2 楼答案

    虽然不是最好的,但很管用

    public class ArrayReader {
    
        public static IntegerArray readIntArray(InputStream input) {
            try(Scanner scanner = new Scanner(input)){
                List<Number> inputList = new LinkedList<>();
                while(scanner.hasNextInt()) {
                    inputList.add(scanner.nextInt());
                }
                int[] iarr = new int[inputList.size()];
                for (int i = 0; i < inputList.size(); i++) {
                    iarr[i] = inputList.get(i).intValue();   
                }
                return new IntegerArray(iarr);
           } 
        }
    }