Ранжирование массива (без сортировки или создания объекта) и сохранение исходного индекса - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть программа, которая должна считывать студенческие идентификаторы и GPA из файла, помещать их в 2 отдельных массива, классифицировать студентов по диапазону GPA, составлять гистограмму этой классификации и, наконец, ранжировать их в соответствии с GPA (учитывать связи), но все равно печатать их в том порядке, в котором они находятся в файле.

Я думаю, что я разобрался с каждой частью программы, но у меня есть одна проблема. Я не знаю, как получить только ранг соответствующего студенческого билета и GPA, чтобы распечатать их вместе с ними. Вместо этого я могу печатать только одну строку, содержащую рейтинг каждого студента / GPA, в одной строке снова и снова.

Пример вывода:

S8887184

3.2

[228, 835, 655, 774, 579, 602, 873, 884, 966, 592, 708, 865 ... и т. Д.]

Желаемый выход:

S8887184

3.2

228

В выходных данных над первой строкой указан идентификационный номер студента, второй - средний балл, третий - ранг среди других учащихся. Если бы я мог также включить способ показать, что звание является ничьей, и сколько других учеников с этим званием связано, это также было бы идеально.

Ниже приведен мой код для справки. Если бы вы могли помочь мне решить эту проблему, это будет с благодарностью! Спасибо!

public static void main(String[] args) throws Exception
{
    Scanner gpadata;
    String snum;
    double gpa;
    String[] IDs = new String[1000];
    double[] GPAs = new double[1000];
    int counter;
    counter = 0;
    int[] gpaGroup = new int[8];

    gpadata = new Scanner(new File("studentdata.txt"));

    while (gpadata.hasNext())
    {
        snum = gpadata.next();
        gpa = gpadata.nextDouble();

        IDs[counter] = snum;
        GPAs[counter] = gpa;

        //Group students by GPA range
        if (GPAs[counter] >= 0.0 && GPAs[counter] < 0.5)
            gpaGroup[0]++;
        else if (GPAs[counter] >= 0.5 && GPAs[counter] < 1.0)
            gpaGroup[1]++;
        else if (GPAs[counter] >= 1.0 && GPAs[counter] < 1.5)
            gpaGroup[2]++;
        else if (GPAs[counter] >= 1.5 && GPAs[counter] < 2.0)
            gpaGroup[3]++;
        else if (GPAs[counter] >= 2.0 && GPAs[counter] < 2.5)
            gpaGroup[4]++;
        else if (GPAs[counter] >= 2.5 && GPAs[counter] < 3.0)
            gpaGroup[5]++;
        else if (GPAs[counter] >= 3.0 && GPAs[counter] < 3.5)
            gpaGroup[6]++;
        else
            gpaGroup[7]++;

        counter++;

    }

    //Round number of students in each GPA group to nearest 10
    int histogram = Math.round(gpaGroup[0]/10);
    int histogram1 = Math.round(gpaGroup[1]/10);
    int histogram2 = Math.round(gpaGroup[2]/10);
    int histogram3 = Math.round(gpaGroup[3]/10);
    int histogram4 = Math.round(gpaGroup[4]/10);
    int histogram5 = Math.round(gpaGroup[5]/10);
    int histogram6 = Math.round(gpaGroup[6]/10);
    int histogram7 = Math.round(gpaGroup[7]/10);

    //Print out GPA group, number of students in that group, and histogram
    System.out.println("GPA Range       #    Histogram");
    System.out.println("0.00 to 0.49   " + gpaGroup[0] + "    " +
            toStars(histogram));
    System.out.println("0.50 to 0.99   " + gpaGroup[1] + "    " +
            toStars(histogram1));
    System.out.println("1.00 to 1.49   " + gpaGroup[2] + "   " +
            toStars(histogram2));
    System.out.println("1.50 to 1.99   " + gpaGroup[3] + "   " +
            toStars(histogram3));
    System.out.println("2.00 to 2.49   " + gpaGroup[4] + "   " +
            toStars(histogram4));
    System.out.println("2.50 to 2.99   " + gpaGroup[5] + "   " +
            toStars(histogram5));
    System.out.println("3.00 to 3.49   " + gpaGroup[6] + "   " +
            toStars(histogram6));
    System.out.println("3.50 to 4.00   " + gpaGroup[7] + "   " +
            toStars(histogram7));

    //Add blank lines between histogram and part 2
    System.out.println();
    System.out.println();

    //print rank
    System.out.println("Student ID Number, GPA, and Class Rank");
    System.out.println();
    for (int k=0; k < IDs.length; k++){
    System.out.println(IDs[k]);
    System.out.println(GPAs[k]);
    System.out.println(Arrays.toString(getRanksArray(GPAs)));
    System.out.println();
    k++;

}
}

//Method to convert rounded # of students to histogram
public static String toStars(int number)
{
    StringBuilder temp = new StringBuilder();
    for(int i=0; i<number; i++){
        temp.append("*");
    }
    return temp.toString();
}


//Method to determine students class rank
public static int[] getRanksArray(double[] array) 
{
int[] result = new int[array.length];

for (int i = 0; i < array.length; i++) {
    int count = 0;
    for (int j = 0; j < array.length; j++) {
        if (array[j] > array[i]) {
            count++;
        }
    }
    result[i] = count + 1;
}
return result;
}   

1 Ответ

0 голосов
/ 04 ноября 2019

Я предлагаю обернуть подсчеты GPA в объект, чтобы вы могли связать индекс с подсчетом.

class GpaCount {
  private int count = 0;
  private final int index;

  public GpaCount(int index) {
    this.index = index;
  }

  public int getCount() {
    return count;
  }

  public void increment() {
    count++;
  }

  public int getIndex() {
    return index;
  }
}

Затем вы можете отсортировать подсчеты, используя Collections.sort(), используя пользовательские Comparator:

List<GpaCount> gpaCounts = new ArrayList<>();

// populate gpaCount (insert your GPA counting logic here)

Comparator<GpaCount> comparator = (GpaCount o1, GpaCount o2) -> Integer.compare(o1.getCount(), o2.getCount());
Collections.sort(gpaCounts, comparator);

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