簡體   English   中英

使用多個類時一次輸入全部時出錯,並且在單個類中可以正常工作

[英]Error with taking inputs all at once , when Using multiple classes and works fine in single class

如果我只使用一個類,它會完美工作,但是當我使用多個類時,我會遇到一個問題,當我將批處理的整個輸入(復制粘貼)提供時,它不起作用(仍在等待更多輸入,但什么也沒做),但是當我手動輸入每個輸入時,效果就很好。

因此,當我引入一個新類時,這個問題就開始了,所以我猜想在與Scanner類一起使用時,該類或繼承有問題。

注意:這是為我的大學實驗室准備的,所以我不能在這里使用文件。

codeWithSingleClass-完美的作品

import java.io.*;
import java.lang.*;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int nooftestCases=scanner.nextInt();

        while(nooftestCases>0) {
            int n,k;
            int[] array = new int[20];
            int sumWithOutRemoval=0 , sumWithRemoval=0;
            n = scanner.nextInt();
            k = scanner.nextInt();
            sumWithOutRemoval = 0;
            for (int i = 0; i < n; i++) {
                array[i] = scanner.nextInt();
                sumWithOutRemoval += array[i];
            }
            if (k == 0) {
                double finalAns = (double) sumWithOutRemoval / n;
                System.out.println(String.format("%.6f", finalAns));
            } else {
                for (int i = 0; i < n; i++) {
                    for (int j = i; j < n; j++) {
                        if (array[i] < array[j]) {
                            int temp = array[i];
                            array[i] = array[j];
                            array[j] = temp;
                        }
                    }
                }
                sumWithRemoval = 0;
                for (int i = 1; i < n - 1; i++) {
                    sumWithRemoval += array[i];
                }
                double finalAns = (double) (sumWithRemoval / (n - (2 * k)));
                System.out.println(String.format("%.6f", finalAns));
            }
            nooftestCases--;
        }
    }
}

codeWithMultipleClasses-hasIssues

import java.io.*;
import java.lang.*;
import java.util.Scanner;

class Sample {

    static int n,k;
    static int[] array = new int[20];
    static int sumWithOutRemoval , sumWithRemoval;

    public void getDetails(){
        Scanner scanner2=new Scanner(System.in);
        n = scanner2.nextInt();
        k = scanner2.nextInt();
        sumWithOutRemoval = 0;
        for (int i = 0; i < n; i++) {
            array[i] = scanner2.nextInt();
            sumWithOutRemoval += array[i];
        }
    }
    public void displayDetails(){
        if (k == 0) {
            double finalAns = (double) sumWithOutRemoval / n;
            System.out.println(String.format("%.6f", finalAns));
        }
        else {
            for (int i = 0; i < n; i++) {
                for (int j = i; j < n; j++) {
                    if (array[i] < array[j]) {
                        int temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                    }
                }
            }
            sumWithRemoval = 0;
            for (int i = 1; i < n - 1; i++) {
                sumWithRemoval += array[i];
            }
            double finalAns = (double) (sumWithRemoval / (n - (2 * k)));
            System.out.println(String.format("%.6f", finalAns));
        }
    }
}
public class Main extends Sample {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int nooftestCases=scanner.nextInt();
        Sample objname= new Sample();
        while(nooftestCases>0) {
            objname.getDetails();
            objname.displayDetails();
            nooftestCases--;
        }
    }
}

我的輸入是

5
5 0
2 9 -10 25 1
5 1
2 9 -10 25 1
5 1
2 9 -10 25 1
5 0
2 9 -10 25 1
5 1
2 9 -10 25 1

預期產量

5.400000
4.000000
4.000000
5.400000
4.000000

您的代碼有兩個Scanner實例; 他們正在模擬輸入蒸汽。 如果我們更改代碼以將Scanner scanner傳遞到Sample對象,並使用它而不是scanner2 ,那么一切都很好。

即是這樣的:

Scanner scanner = new Scanner(System.in);
int nooftestCases = scanner.nextInt();
Sample objname = new Sample(scanner);

和:

class Sample {
    ...

    private final Scanner scanner;

    public Sample(Scanner scanner) {
        this.scanner = scanner;
    }

    public void getDetails() {
        n = scanner.nextInt();
        k = scanner.nextInt();
        sumWithOutRemoval = 0;
        for (int i = 0; i < n; i++) {
            array[i] = scanner.nextInt();
            sumWithOutRemoval += array[i];
        }
    }
...

順便說一句,此代碼還有更多改進的機會。 格式化將是其中之一,尤其是在Stack Overflow上發布時。 static字段(更不用說它們未指定的范圍)尤其使我的眼睛受傷。 對於使這樣的算法代碼在更廣泛的應用程序中很好地工作,這將令人懷疑。 kv是什么(建議使用更具描述性的名稱)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM