1

ハードドライブ上の2つのファイルから入力を取得しています。

studentNames.txtとstudentScores.txt-名前には学生IDと名前があり、スコアには学生IDとスコアがあります。データを2つのArrayListに入れ、成績が一致するIDになるようにデータを並べ替えたいと思います。

例えば:

+------+--------------+---------+
|  ID  |     Name     |  Grade  |
+------+--------------+---------+
| 3305 | Smith Henry  | 92.0    |
| 5555 | Eddy Olivia  | 95.5    |
| 8915 | Johnson Luke | 98.5    |
+------+--------------+---------+

そして、データにはID /グレードだけが入力され続けます-ifステートメントを使用する必要があることはわかっていますが、それをどのように行うのでしょうか?

これが私のコードです:

import java.util.*;
import java.io.*;

public class P_Supplemental_9 {

public static void main(String[] args) throws FileNotFoundException {
   File file1 = new File("c:/temp/studentNames.txt");
   File file2 = new File("c:/temp/studentScores.txt");

   if(file1.exists()) {
   Scanner input = new Scanner(file1);

   ArrayList<Student> students = new ArrayList();

   while(input.hasNext()) {
   students.add(new Student(input.nextInt(),input.nextLine()));
   }

   input.close();

   for(int o = 0;o < students.size();o++) {
   System.out.printf("%10d %20s avg\n", students.get(o).getStuId(),     students.get(o).getStuName());

   } // end for

   }

   if(file2.exists()) {
       Scanner input = new Scanner(file2);

       ArrayList<Student> grades = new ArrayList();

       while(input.hasNext()) {
           grades.add(new Student(input.nextInt(), input.nextLine()));

       } /// end while
       input.close();

   for(int o = 0;o < grades.size();o++) {

       System.out.printf("%10d %20s avg\n", grades.get(o).getStuId(), grades.get(o).getStuName());
   } // end for

   } // end if(file2.exists)





  } // end main method
 } // end P_Supplemental_9



class Student {
    private int stuId;
    private String stuName;
    private ArrayList <Double> grades;

    Student(int idIn, String nameIn) {

        this.stuId = idIn;
        this.stuName = nameIn;
       } // end student class

    Student(int idIn, ArrayList gradesIn) {
        this.stuId = idIn;
        this.grades = gradesIn;

    }

        public int getStuId() {
            return stuId;
        }

        /**
         * @param stuId the stuId to set
         */
        public void setStuId(int stuId) {
            this.stuId = stuId;
        }

        /**
         * @return the stuName
         */
        public String getStuName() {
            return stuName;
        }

        /**
         * @param stuName the stuName to set
         */
        public void setStuName(String stuName) {
            this.stuName = stuName;
        }

        /**
         * @return the grades
         */
        public ArrayList getGrades() {
            return grades;
        }

        /**
         * @param grades the grades to set
         */
        public void setGrades(ArrayList grades) {
            this.grades = grades;
        }

} // end student class

Studentnames.txtのデータは次のとおりです

3305 Smith Henry
5555 Eddy Olivia
8915 Johnson Luke

これがStudentscores.txtからのデータです

3305 92.0
5555 95.5
8915 98.5
3305 89.0
5555 90.5
8915 95.5
3305 78.5
5555 85.0
8915 82.0
4

5 に答える 5

2

2つのリストを並べ替えるために使用できCollections#sort(List, Comparator)ます。

彼らが学生と彼らのスコアの間の1対1の関係であると仮定すると、これはあなたが学生とスコアとリストの各要素を取得することを可能にします。

こんな感じだと思います。

Collections.sort(studentNames, new Comparator<Student>() {
    public int compareTo(Student o1, Student o2) {
        return o1.getStuId() - o2.getStuId();
    }
});

これListにより、学生IDで注文された学生が提供されます。

次に、同じ概念を使用してスコアリストを並べ替えます。それができたら、2つのリストは学生IDの順序になり、ループできるようになります。

もう1つのアイデアはMap、学生IDに合わせて学生とスコアを保存することです。

その後、マップのキーを繰り返し、各生徒を引き出し、それらのIDに基づいてスコアを付けることができます。

要件を満たすように更新

更新された要件を読んだ後、リストよりもソートされたマップを使用する方がよいことに気付きました。

基本的に、各学生の名前を、個々のIDに対してキー設定された並べ替えられたマップに配置します。次に、IDに対してキー設定されたソート済みマップ内のリストにそれぞれを配置します

public class TestArraySort {

    public static void main(String[] args) {
        new TestArraySort();
    }

    public TestArraySort() {

        try {
            File file1 = new File("studentNames.txt");
            File file2 = new File("studentScores.txt");

            // Better to check for both files here, other wise it's just wasting time
            if (file1.exists() && file2.exists()) {
                // Create the sorted maps so that they are in scope...
                Map<Integer, String> mapStudents = new TreeMap<Integer, String>();
                Map<Integer, List<Double>> mapScores = new TreeMap<Integer, List<Double>>();

                Scanner input = null;
                try {
                    input = new Scanner(file1);
                    // Read the student information...
                    while (input.hasNext()) {
                        int id = input.nextInt();
                        String name = input.nextLine().trim();
                        mapStudents.put(id, name);
                    }
                    // Safty net
                } finally {
                    input.close();
                }

                try {
                    // Read the scores
                    input = new Scanner(file2);
                    while (input.hasNext()) {
                        int id = input.nextInt();
                        double score = input.nextDouble();

                        // If the list doesn't already exist, create it
                        List<Double> scores = mapScores.get(id);
                        if (scores == null) {
                            scores = new ArrayList<Double>(25);
                            mapScores.put(id, scores);
                        }
                        scores.add(score);
                    } /// end while
                    // Safty net
                } finally {
                    input.close();
                }

                // Dump the results
                System.out.println("+------------+----------------------+------+");
                for (Integer id : mapStudents.keySet()) {
                    // Display the student results
                    String name = mapStudents.get(id);
                    System.out.printf("| %10d | %-20s | ", id, name);
                    List<Double> scores = mapScores.get(id);
                    if (scores.size() > 0) {

                        // Sort the list
                        Collections.sort(scores);
                        // Reverse the list so that the scores are now in order from highest to lowest
                        // Sure, I could create a reverse comparator when I sort it, but
                        // I'm lazy...
                        Collections.reverse(scores);

                        // Print the first score...
                        System.out.printf("%4.1f |\n", scores.get(0));
                        // Print the remaining scores...
                        for (int index = 1; index < scores.size(); index++) {
                            System.out.printf("| %10s | %-20s | %4.1f |\n", "", "", scores.get(index));
                        }

                    } else {

                        System.out.println("00.0 |");

                    }
                    System.out.println("+------------+----------------------+------+");

                }

            } // end if(file2.exists)    }

        } catch (IOException exp) {
            exp.printStackTrace();
        }
    }
}

生成する

+------------+----------------------+------+
|       3305 | Smith Henry          | 92.0 |
|            |                      | 89.0 |
|            |                      | 78.5 |
+------------+----------------------+------+
|       5555 | Eddy Olivia          | 95.5 |
|            |                      | 90.5 |
|            |                      | 85.0 |
+------------+----------------------+------+
|       8915 | Johnson Luke         | 98.5 |
|            |                      | 95.5 |
|            |                      | 82.0 |
+------------+----------------------+------+
于 2012-10-29T02:02:45.323 に答える
0

異なるarrayListsからの2つの値を比較しようとしている場合、それらが文字列値であると想定します

if (array1.get(i).toString().compareTo(array2.get(j).toString()) == 0)。

于 2012-10-29T01:59:02.320 に答える
0

効率と書きやすさの両方の観点から、最善のアプローチはを使用することだと思いますMap。いずれかのファイルを読むときに、学生IDをそれに関連付けられたデータ(名前またはテストスコアのいずれか)にマップします。次に、学生IDのセットをトラバースし、名前とスコアをそれぞれnameMap.get(id)とで取得します。scoreMap.get(id)ここで、それぞれidはIDのセットの要素であり、で取得できnameMap.keySet()ます。

于 2012-10-29T02:04:45.597 に答える
0

に実装Comparableしますclass。これで、簡単に呼び出すことができますCollections.sort(studentNames)(と仮定しstudentNamesList

于 2012-10-29T02:07:26.500 に答える
0
File one data
abc
abcd
bcd

file two data
abc
abcd 
bcd
cdf


final resutlt

abc
abc 
abcd
abcd
bcd
bcd
cdf



package com.ravisoft.logic;
/*
String tempDataArray[] =
    StringUtils.split(mergeStr, Utils.LINE_SEPARATOR);
java.util.Arrays.sort(tempDataArray);

String data = StringUtils.join(tempDataArray, Utils.LINE_SEPARATOR, 0);*/

import java.util.ArrayList;
import java.util.Collections;
import java.io.*;

public class ReadDemo
{
    public static void main(String args[]){
        ArrayList<String> fileData = new ArrayList<String>();
        String fileName1 = "E:\\ROUTINE_WORK\\MAY_ROUTINE_WORK\\MAY282013\\New1.TXT";
        String fileName2 = "E:\\ROUTINE_WORK\\MAY_ROUTINE_WORK\\MAY282013\\New2.TXT";
        int lines = 0;
        try 
        {
          // set up input stream1
        FileReader fr1 = new FileReader(fileName1);
          // buffer the input stream
        BufferedReader br1 = new BufferedReader(fr1);

          // set up input stream2
        FileReader fr2 = new FileReader(fileName2);
          // buffer the input stream
        BufferedReader br2 = new BufferedReader(fr2);

          // read and display1
        String buffer1 = "";



        while ((buffer1 = br1.readLine()) != null)
        {
          fileData.add(buffer1);

          System.out.println("First file: "+buffer1);  // display the line
          ++lines;
        }

      br1.close();

        String buffer2 = "";


            while ((buffer2 = br2.readLine()) != null) 
            {
                  fileData.add(buffer2);

                  System.out.println("Second file: "+buffer2);  // display the line
                  ++lines;
            }

      br2.close();
    System.out.println("Total lines before sorting: "+lines);
    lines=0;
      Collections.sort(fileData);


      System.out.println("Sorted list");
      System.out.println();
      System.out.println();
      System.out.println();
      System.out.println();
      System.out.println();

        for(String s : fileData) {
            ++lines;
          System.out.println(s);
        }
        System.out.println("Total lines after sort: "+lines);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

      }

}
于 2013-05-28T08:07:22.013 に答える