使用InputStream作为输入将对象方法转换为要打印的数组

时间:2018-11-08 20:50:47

标签: java arrays

我有一个方法来读取IntegerArray,它是一个类,输入是InputStream。我尝试使用扫描仪,但仍坚持填写数组并创建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 个答案:

答案 0 :(得分:2)

使用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)方法将Integer对象流转换为本地int编号流,最后使用int[]作为toArray()进行收集。方法,这是我们旨在根据您的构造函数需要获取的方法。

是否已使用包装器Integer类声明了构造函数,

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

那么我们只需编写一下就可以实现

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

希望有帮助。

答案 1 :(得分:0)

不是最好的,但是它可以工作

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);
       } 
    }
}