繁体   English   中英

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

[英]Converting object method with InputStream as input to array to print

我有一种方法来读取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();
    }


}

使用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编号的流,最后使用toArray()方法将其作为int[]收集,这是我们的目标。根据您的构造函数的需要。

如果您使用包装器Integer类这样声明了构造函数,

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

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

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

希望能帮助到你。

不是最好的,但是它有效

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM