Метод, который читает с клавиатуры (параметр с 1 значением) или из файла (параметр с 0 значением), не работает должным образом с параметром 0 - PullRequest
1 голос
/ 16 марта 2020

Я хочу, чтобы мой метод считывал треугольники с клавиатуры или из файла, а затем добавлялся к ArrayList .. У меня есть 2 класса: точка, определяемая двумя координатами: int c1,int c2, и класс треугольника, определенный цветной строкой и 3 точки. У меня есть 2 метода, один в Triangle классе и один в Point классе:

Метод класса треугольника:

public Triangle readingTriangle(int value) throws Exception {
        if(value == 1) {
        Scanner sc = new Scanner(System.in);
        Triangle reserve =new Triangle();
        reserve.color = sc.next();
        reserve.setA(reserve.A.readingPoint(1));
        reserve.setB(reserve.B.readingPoint(1));
        reserve.setC(reserve.C.readingPoint(1));
        return reserve;
        }
        if(value == 0) {
            Scanner input = new Scanner(new File("File"));
            Triangle reserve1 =new Triangle();

            reserve1.color=input.next();
            reserve1.setA(reserve1.A.readingPoint(0));
            reserve1.setB(reserve1.B.readingPoint(0));
            reserve1.setC(reserve1.C.readingPoint(0));
            return reserve1;
        }
        return new Triangle();


    }

Метод класса точки:

public Point readingPoint(int value) throws Exception {
        if(value==1) {
        Scanner sc = new Scanner(System.in);
        Point reserve=new Point();
        reserve.c1 = sc.nextInt();
        reserve.c2 = sc.nextInt();
        return reserve;
        }
        if(value==0) {
            Point reserve1=new Point();
            Scanner input1 = new Scanner(new File("File"));

            input1.next();
            reserve1.c1=input1.nextInt();
            reserve1.c2=input1.nextInt();


            return reserve1;

        }
        return new Point();

    }

В тестовом классе:

    Scanner sc = new Scanner(System.in);
    int triangleNumber = sc.nextInt();
    List<Triangle> triangleList = new ArrayList<Triangle>();

    for (int i = 0; i < triangleNumber; i++) {
        Triangle t = new Triangle();
        Triangle t1 = t.readingTriangle(0);
        triangleList.add(t1);

    }
    System.out.println(triangleList);

Мой вывод:

[Triangle [color=green, A=Point [c1=20, c2=20], B=Point [c1=20, c2=20], C=Point [c1=20, c2=20]]]

Мой файл:

green
20 20
40 40
60 60

Во-первых, я хочу упомянуть, что первый фрагмент метода работает (1 значение параметра работает), у меня проблемы с чтением из файла. Вы можете увидеть проблему из вывода: «20 20» дано для B и C баллов.

У меня есть некоторые вещи, которые я стараюсь уважать:

  • Я хочу, чтобы мои структуры методов, по возможности, соблюдались;

  • Использование сканера обязательно (я знаю, что это старая техника);

  • Я не хочу менять свой файл, потому что, если бы это был настоящий блокнот, я не думаю, что останусь, чтобы что-то менять в блокноте.

Другие наблюдения:

Я думаю, что проблема в методах сканера, я пробовал с while (input1.hasNext()).

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Но, если вы настаиваете на том, чтобы не изменять свои параметры и сохранять ту же структуру вашего фактического кода, вы можете использовать метод синглтона, который я не рекомендую , особенно если вы работаете с потоками. Он отлично работает, если вы не используете потоки.

Таким образом, чтобы использовать один экземпляр Scanner (или любой другой тип данных или класс), вы можете использовать шаблон проектирования "Singleton", который состоит в создании экземпляра один экземпляр вашего объекта для всего проекта.

Определение Singleton для ввода с клавиатуры (новый класс):

import java.util.Scanner;

public class ScannerSingletonKeyboard {
      private static Scanner sc = null;

    private ScannerSingletonKeyboard(){
        sc = new Scanner(System.in); 

    }

    public static Scanner getInstance(){
        if(sc==null)
             new ScannerSingletonKeyboard();
        return sc;

    }
}

Определение Singleton для ввода из файла (новый класс) ):

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class ScannerSingletonFile {
      private static Scanner sc = null;

    private ScannerSingletonFile(){
        try {
            Scanner sc = new Scanner(new File("File"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    public static Scanner getInstance(){
        if(sc==null)
             new ScannerSingletonFile();
        return sc;

    }
}

Метод класса треугольника:

public Triangle readingTriangle(int value) throws Exception {
    if(value == 1) {
        Scanner sc = ScannerSingletonKeyboard.getInstance();
        Triangle reserve =new Triangle();
        reserve.color = sc.next();
        reserve.setA(reserve.A.readingPoint(1));
        reserve.setB(reserve.B.readingPoint(1));
        reserve.setC(reserve.C.readingPoint(1));
        return reserve;
    }
    if(value == 0) {
        Triangle reserve1 =new Triangle();
        Scanner input = ScannerSingletonFile.getInstance();
        reserve1.color=input.next();
        reserve1.setA(reserve1.A.readingPoint(0));
        reserve1.setB(reserve1.B.readingPoint(0));
        reserve1.setC(reserve1.C.readingPoint(0));
        return reserve1;
    }
    return new Triangle();


}

Метод класса точки:

public Point readingPoint(int value) throws Exception {
    if(value==1) {
        Scanner sc = ScannerSingletonKeyboard.getInstance();
        Point reserve=new Point();
        reserve.c1 = sc.nextInt();
        reserve.c2 = sc.nextInt();
        return reserve;
    }
    if(value==0) {
        Scanner input = ScannerSingletonFile.getInstance();
        Point reserve1=new Point();
        input.next();
        reserve1.c1=input.nextInt();
        reserve1.c2=input.nextInt();


        return reserve1;

    }
    return new Point();

}

В классе теста:

Scanner sc = ScannerSingletonKeyboard.getInstance();


int triangleNumber = sc.nextInt();
List<Triangle> triangleList = new ArrayList<Triangle>();
for (int i = 0; i < triangleNumber; i++) {
    Triangle t = new Triangle();
    Triangle t1 = t.readingTriangle(0);
    triangleList.add(t1);

}
System.out.println(triangleList);

и каждый раз, когда вы хотите использовать свой сканер в любом месте, вам нужно всего лишь вызвать ScannerSingletonKeyboard.getInstance() для ввода с клавиатуры или ScannerSingletonFile.getInstance() для ввода файла, который вернет ваш единственный экземпляр сканера

1 голос
/ 16 марта 2020

вы должны использовать тот же экземпляр Scanner. здесь вы создаете новый экземпляр в каждой итерации в l oop, поэтому каждый раз он начинается с начала файла. Поэтому я предлагаю создать один экземпляр в главном классе и передать его в качестве параметра в ваших методах.

Метод класса треугольника:

public Triangle readingTriangle(int value, Scanner sc,Scanner input) throws Exception {
    if(value == 1) {
    Triangle reserve =new Triangle();
    reserve.color = sc.next();
    reserve.setA(reserve.A.readingPoint(1,sc,input));
    reserve.setB(reserve.B.readingPoint(1,sc,input));
    reserve.setC(reserve.C.readingPoint(1,sc,input));
    return reserve;
    }
    if(value == 0) {
        Triangle reserve1 =new Triangle();

        reserve1.color=input.next();
        reserve1.setA(reserve1.A.readingPoint(0,sc,input));
        reserve1.setB(reserve1.B.readingPoint(0,sc,input));
        reserve1.setC(reserve1.C.readingPoint(0,sc,input));
        return reserve1;
    }
    return new Triangle();


}

Метод класса точки:

public Point readingPoint(int value, Scanner sc,Scanner input) throws Exception {
    if(value==1) {
    Point reserve=new Point();
    reserve.c1 = sc.nextInt();
    reserve.c2 = sc.nextInt();
    return reserve;
    }
    if(value==0) {
        Point reserve1=new Point();
        reserve1.c1=input.nextInt();
        reserve1.c2=input.nextInt();


        return reserve1;

    }
    return new Point();

}

В классе теста:

Scanner sc = new Scanner(System.in); //the only time you create new instance of Scanner(System.in) -> for keybord input
Scanner input = new Scanner(new File("File"));//the only time you create new instance of Scanner(new File("File")) -> for file input

int triangleNumber = sc.nextInt();
List<Triangle> triangleList = new ArrayList<Triangle>();
for (int i = 0; i < triangleNumber; i++) {
    Triangle t = new Triangle();
    Triangle t1 = t.readingTriangle(0,sc,input);
    triangleList.add(t1);

}
System.out.println(triangleList);
...