二重ループにつきまして


Javaの質問です。こちらにサンプルコード
https://gist.github.com/AuroraNorthernQuarter/d7581504171559e521183af86719d1a9
がありまして、問題なく動いてはいるのですが。
コードをスッキリさせたいと考えております。
for文の二重ループ?というんでしょうか。この部分だけ、新たなクラスとして別のjavaファイルに持っていきまして。
本体(Sampleクラス)から、呼び出すような形にして、同時に、二重ではなくスッキリ見せたいのですが。
方法等ありましたらお教えいただけないでしょうか。
よろしくお願い致します。

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2018/11/03 20:19:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rsc96074 No.1

回答回数4503ベストアンサー獲得回数437

ポイント1000pt

 こちらは参考になるでしょうか。

package testprogramm;

import java.util.Scanner; 

class Person {
    private String name = "";
    private double height = 0.0;
    
    //--- コンストラクタ ---//
    Person()                            { }
    Person(String name, double height)  { set(name, height); }

    //--- 取得 ---//
    String getName()    { return name; }
    double getHeight()  { return height; }
    
    //--- 設定 ---//
    void setName(String name)       { this.name = name; }
    void setHeight(double height)   { this.height = height; }
    void set(String name, double height){
        this.name = name;
        this.height = height;
    }
    //--- 文字列表現を返却 ---//
    public String toStr(){
        return name + ":"+ height + "cm";
    }
    public String toStr(int n){
        if (n==0) return name;
        else      return height + "cm";
    }
}
    
public class Sample { 

    static void Disp(Person[] p){
        int n = p.length;
        double sum = 0;
        for (int i = 0; i < n*n; i++){
            int m = (i%n==0)? i/n : i%n;
            if (0< i%n && i%n<=i/n) m-=1;
            System.out.println(p[m].toStr(i%n));
        }
        for (int i = 0; i< n; i++)
            sum = sum + p[i].getHeight();
        System.out.println("平均:" + sum/n+ "cm");
    }
    
    public static void main(String args[]) {

        Scanner scan = new Scanner(System.in); 

        while (true) { 
            System.out.print("得点を入力してください: "); 
            // キーボードから整数の入力を受け取る 
            int score = scan.nextInt(); 

            if (score > 90) { 
                System.out.println("おめでとう! 合格です"); 
                Person[] p = {
                    new Person("鈴木", 168.7),
                    new Person("杉山", 173.4),
                    new Person("田中", 155.8),
                };
                Disp(p); 
                break; 
            } else if (score >= 60) { 
                System.out.println("もう少し頑張りましょう。"); 
                Person[] p = {
                    new Person("橋本", 166.3),
                    new Person("高杉", 159.1),
                    new Person("佐藤", 177.4),
                };
                Disp(p); 
                break; 
            } else if (score < 0) { 
                break; 
            } 
        }
        scan.close(); 
    }
}
他3件のコメントを見る
id:moon-fondu

Person.javaは長くなっても構いませんので、よろしくお願いします。

2018/11/03 14:11:58
id:rsc96074

 それなら、Person.javaはそのままで、Persons.javaを追加して、Sample.javaをそれに伴って修正してみます。(^_^;
 プログラムは、次のPerson.java、Persons.java、Sample.javaの3つから成ります。
● Person.java
 上記と同じなので省略。

● Persons.java

package testprogramm;

import java.util.ArrayList;

public class Persons {
    private ArrayList<Person> persons;

    //--- コンストラクタ ---//
    public Persons() { this.persons = new ArrayList<Person>(); }
    
    public void add(Person person) { persons.add(person); }
    public int count() { return persons.size(); }
    
    //--- 平均値を求める ---//
    public double getAverage() {
        double sum = 0.0;
        for (Person p : persons)
            sum += p.getHeight();
        return sum / (double)count();
    }
    
    //--- 文字列表現を返却 ---//
    public String toStr() {
        int n = count();
        String s = "";
        for (int i = 0; i < n*n; i++){
            int m = (i%n==0)? i/n : i%n;
            if (0< i%n && i%n<=i/n) m-=1;
            s += persons.get(m).toStr(i%n) + '\n';
        }
        return s;
    }
    
    //--- Default Data の作成 ---//
    public void makeDefaultData1() {
        persons.add(new Person("鈴木", 168.7));
        persons.add(new Person("杉山", 173.4));
        persons.add(new Person("田中", 155.8));
    }
    
    public void makeDefaultData2() {
        persons.add(new Person("橋本", 166.3));
        persons.add(new Person("高杉", 159.1));
        persons.add(new Person("佐藤", 177.4));
    }
    
    //--- 表示 ---//
    public void Disp() {
        System.out.print  (toStr());
        System.out.println("平均:" + getAverage() + "cm");
    }
}


● Sample.java

package testprogramm;

import java.util.Scanner;

public class Sample {

    static void Disp(Persons p){
        System.out.print  (p.toStr());
        System.out.println("平均:" + p.getAverage() + "cm");
    }
    
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in); 

        while (true) { 
            System.out.print("得点を入力してください: "); 
            // キーボードから整数の入力を受け取る 
            int score = scan.nextInt(); 

            if (score > 90) { 
                System.out.println("おめでとう! 合格です"); 
                Persons p = new Persons();
                p.makeDefaultData1();
                p.Disp();   //Disp(p);
                break;
            } else if (score >= 60) { 
                System.out.println("もう少し頑張りましょう。"); 
                Persons p = new Persons();
                p.makeDefaultData2();
                p.Disp();
                break; 
            } else if (score < 0) {
                break; 
            } 
        }
        scan.close();
    }
}
2018/11/04 06:29:07

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません