как использовать сканер в foreachloop для хранения ввода из командной строки в массив - PullRequest
0 голосов
/ 14 февраля 2010

Ниже приведен мой код: я определил класс Student, который имеет фамилию, имя и счет, а также методы get и set для того же, что и ниже.

В основном я создаю массив студенческих объектов. Массив должен получить значение своего элемента из командной строки. Я не знаю, как использовать сканер в цикле foreach для хранения ввода из командной строки в массив.

Основное назначение - прочитать 3 записи для нескольких учащихся и показать отсортированные результаты в соответствии с фамилией.

package student;

abstract class Student implements Comparable{

private String lastname;
private String firstname;
private int score;

public Student( ){

}

public void setLastname(String lastname)
{
  this.lastname= lastname;
}

public void setFirstName(String firstname)
{
    this.firstname = firstname;
}

public void setScore(int score)
{
    this.score=score;

}
public String getLastName()
{
    return lastname;
}

public String getFirstName()
{
    return firstname;
}

public int getScore()
{
    return score;
}

public int CompareTo(Object o)
{
    Student s = (Student) o;
    int comparison;
    final int EQUAL = 0;

    comparison=this.lastname.compareTo(s.lastname);
    if(comparison != EQUAL)
        return comparison;
    else comparison = this.firstname.compareTo(s.firstname);
    if(comparison!= EQUAL)
        return comparison;
    return EQUAL;

}
}

package student;


import java.util.Scanner;
import java.util.Arrays;
public class Main {

/**
 * @param args the command line arguments
 */

public static void main(String[] args) {
    // TODO code application logic here

    System.out.println("Welcome to the Students Score Application");

    System.out.print("Enter the number of Students:  ");

    Scanner sc = new Scanner(System.in);
   int num_Students = sc.nextInt();

   Student[] stu = new Student[num_Students];
   String lname ="";
   for(Student s: stu)
   {
       int count = 1;
       System.out.print("Student " + count + " Last Name: ");
      //if(sc.hasNext())
      // lname = sc.nextLine();
      // s[lname];
       System.out.println("Student " + count + "First Name: ");

      // if(sc.hasNext())
      // s.setFirstName(sc.nextLine());
       System.out.println("Student " + count + "Score: ");
      // if(sc.hasNextInt())
      // s.setScore(sc.nextInt());
       count++;
       sc.nextLine();
   }
   Arrays.sort(stu);

   for (Student s: stu)
       System.out.println(s.getLastName()+ " , " + s.getFirstName()+ ":" + s.getScore());
}

}

Ответы [ 5 ]

0 голосов
/ 18 февраля 2010

Большое спасибо за отзыв. Это была моя первая попытка такого рода опубликовать вопрос в Интернете, и вы заставили меня понять, что это работает:).

Я понял, где моя ошибка. Это было в объявлении моего метода compareTo (), где я использовал «C» вместо «c» для CompareTo помимо некоторых изменений в main. Вот оно:

Файл драйвера: импорт java.util.Scanner; import java.util.Arrays;

публичный класс Main {

public static void main(String[] args) {

    System.out.println("Welcome to the Students Score Application");

    Scanner sc = new Scanner(System.in);
    System.out.print("Enter the number of Students:  ");
    int num_Students = Validator.getInt(sc);

   Student[] stu = new Student[num_Students];

     for(int i =0 ; i<stu.length ;i++)
   {
       int count = 1;

     String  lname = Validator.getString(sc,"Student " + count + " Last Name: ");

     String  fname=Validator.getString(sc,"Student " + count + " First Name: ");


     System.out.print("Student " + count + " Score: ");
      int  score= Validator.getIntWithInRange(sc,0,100);
          System.out.println();
       count++;
       stu[i]= new Student(lname,fname,score);
   }
   Arrays.sort(stu);

   for (Student s: stu)
       System.out.println(s.getLastName()+ " , " + s.getFirstName()+ ":" + s.getScore());
}

}

Файл Student.java

Публичный класс Студент реализует сопоставимый {

private String lastname;
private String firstname;
private int score;

public Student(String lastname,String firstname,int score ){
  this.lastname= lastname;
  this.firstname = firstname;
  this.score=score;
}


public String getLastName()
{
    return lastname;
}

public String getFirstName()
{
    return firstname;
}

public int getScore()
{
    return score;
}

public int compareTo(Object o)
{
    Student s = (Student) o;
    int comparison;
    final int EQUAL = 0;

    comparison=this.lastname.compareTo(s.lastname);
    if(comparison != EQUAL)
        return comparison;
    else comparison = this.firstname.compareTo(s.firstname);
    if(comparison!= EQUAL)
        return comparison;
    return EQUAL;

}

}

файл валидатора:

import java.util.Scanner;

Public Class Validator {

public static String getString(Scanner sc , String prompt)
{
  /*  System.out.print(prompt);

    String s = sc.next();
     if (s.equals(""))
    return "Enter some name"; // read the user entry
else return s ;*/
      String s = "";

// Scanner sc1 = новый сканер (System.in); // System.out.println (prompt);

boolean isValid = false;
 while (isValid == false )
    {
        System.out.print(prompt);

            s = sc.nextLine();


             if (s.equals("")){
                System.out.println("This entry is required. Try again.");

             }
             else
            isValid = true;
     }

                 return s;
}


    public static int getInt(Scanner sc)
{

     int i = 0;
    boolean isValid = false;
    while (isValid == false)
    {

        if (sc.hasNextInt())
        {
            i = sc.nextInt();
            isValid = true;
        }
        else
        {
            System.out.println("Error! Invalid integer value. Try again.");
        }
        sc.nextLine();
                // discard any other data entered on the line
    }
    return i;
}

     public  static int getIntWithInRange(Scanner sc,int min, int max)
       {
  int i = 0;
    boolean isValid = false;
    while (isValid == false)
    {
        i = getInt(sc);
        if (i < min)
            System.out.println("Error!Number must be greater than " + (min-1) + ".");
        else if (i > max)
            System.out.println("Error! Number must be less than " + (max+1) + ".");
        else
            isValid = true;
    }
    return i;
       }

}

Еще раз. Большое спасибо всем.

С уважением, Kathy

0 голосов
/ 14 февраля 2010

Я думаю, что вы смешиваете системный ввод и командную строку.Второй означает, что вы передаете студентов в программу в качестве аргументов программы, например

java Student 2 Paul Thomson 5 Mike Keig 6

для анализа такой строки команд вам необходим следующий код:

public static void main(String[] args) {
    int num_Students = Integer.parseInt(args[0]);   //Really not necessary 
    List<Student> stu = new LinkedList<Student>();
    for (int i = 1; i < args.length; i += 3) {
        Student student = new Student();
        student.setFirstName(args[i]);
        student.setLastname(args[i + 1]);
        student.setScore(Integer.parseInt(args[i + 2]));
        stu.add(student);
    }
}

Если вы предпочитаете читать студентов из системного ввода, вы можете использовать класс Scaner.Как правило, ваш код должен работать, если вы удалите комментарии, создадите знак Studend и удалите реферат из класса Studend.

0 голосов
/ 14 февраля 2010

У вас есть статическая функция void main, которая принимает 2 аргумента - int argc и string [] argv First of it - количество строк во втором аргументе Второй аргумент - командная строка разделяется пробелом Поэтому вам нужно запустить цикл, чтобы сохранить каждый аргумент командной строки в ваших объектах

static void main(int argc, string [] argv)
{
   Obj [] objs = new Obj[argc];
   for(int i = 0; i < argc; i++)
      obj[i].value = argv[i];
}
0 голосов
/ 14 февраля 2010

Если вы хотите просмотреть аргументы командной строки, вам нужно отсканировать поле args[] из main.

... и ответить на ваш вопрос из заголовка:

public static void main(String[] args) {
    String arguments = "Anton Bert Charly";

    Scanner scanner = new Scanner(arguments);

    String[] s = new String[3];
    // Scan
    for (int i = 0; i < s.length; i++) {
        if (scanner.hasNext()) {
            s[i] = scanner.next();
        }
    }

    // Print out
    for (int i = 0; i < s.length; i++) {
        System.out.println(s[i]);
    }
}

отсканирует строку arguments и распечатает:

Anton
Bert
Charly

(хотя он не использует цикл foreach)

С уважением, Майк
[; -)

0 голосов
/ 14 февраля 2010

Извините, но я не понимаю этого:

Student[] stu = new Student[num_Students];
String lname ="";
for(Student s: stu)
{
 ...
}

Насколько я знаю, создание массива учеников НЕ будет создавать нового ученика для каждой ячейки массива. Таким образом, ваш цикл не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...