Как пропустить индекс посещенных (дублирующих) значений? - PullRequest
0 голосов
/ 12 мая 2019

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

 //student number        total hours
    Student      Weekly study
    Student0     34
    Student1     28
    Student2     20
    Student3     31
    Student4     32
    Student5     28
    Student6     37
    Student7     41

Второе задание состояло в том, чтобы организовать учеников в самые длинные часы. Сначала я организовал фактические часы, изученные в массиве:

public static void sort(Integer[] array){
    Integer studentNumber [] = new Integer[8];
     Integer temp[] = new Integer[8];
    for (int i = 0; i < array.length;i++){
        temp[i] = array[i];//declaring value of index so it doesn't change
    }
    Arrays.sort(array, Collections.reverseOrder());//sorted the original array in descending order 
  }

Затем мне нужно было отобразить студента (идентифицируя его по номеру их исходного индекса, например, у student0 есть 34), поэтому я сделал цикл для сравнения двух значений, если это произойдет, тогда он будет использовать индекс из 'temp':

     for (int i = 0; i < temp.length;i++){
        for (int j = 0; j < array.length;j++){
             if (array[i].equals(temp[j] )){

                 System.out.println("Student" + j + "\t " + array[i]);
                 break;
             }
        } 

выход: * +1010 *

     Student7    41
     Student6    37
     Student0    34
     Student4    32
     Student3    31
     Student1    28
     Student1    28
     Student2    20

как вы можете видеть, он показывает student1 дважды, когда он должен показывать, должен показывать 5 после, однако, поскольку они имели одинаковое значение, он ищет первое, что равно ему.

Я искал решения и пытался создать переменную, чтобы проверить, был ли индекс уже посещен:

    int pointer =0;
    for (int i = 0; i < temp.length;i++){
        for (int j = 0; j < array.length;j++){
             if (array[i].equals(temp[j] )&& i > pointer){

                 System.out.println("Student" + j + "\t " + array[i]);
                 break;
             }
        }
        pointer++;
    }

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

1 Ответ

0 голосов
/ 12 мая 2019

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

Используйте LinkedHashMap для хранения данных в виде пар ключ-значение.Затем выполните итерацию карты и вставьте их в другую карту, сравнив значения с помощью Comparator.

LinkedHashMap<String, Integer> students = new LinkedHashMap<>(),
        sortedStudents = new LinkedHashMap<>();

students.put("Student0", 34);
students.put("Student1", 28);
students.put("Student2", 20);
students.put("Student3", 31);
students.put("Student4", 32);
students.put("Student5", 28);
students.put("Student6", 37);
students.put("Student7", 41);

List<Map.Entry<String, Integer>> list = new ArrayList<>(students.entrySet());
list.sort(Entry.comparingByValue(new Comparator<Integer>() {
    public int compare(Integer o1, Integer o2) {
        if (o1.intValue() < o2.intValue()) {
            return 1;
        } else if (o1.intValue() > o2.intValue()) {
            return -1;
        }
        return 0;
    }
}));

for (Entry<String, Integer> entry : list) {
    sortedStudents.put(entry.getKey(), entry.getValue());
}

System.out.println(sortedStudents);

Вывод:

{Student7=41, Student6=37, Student0=34, Student4=32, Student3=31, Student1=28, Student5=28, Student2=20}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...