如何跳过已访问(重复)值的索引?

时间:2019-05-12 15:29:56

标签: java loops

所以基本上我需要制作一个包含学习时间的数组。第一个任务是获取总数并将其存储在我完成的数组中,

 //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'的索引: / p>

     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;
             }
        } 

输出:

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

如您所见,它应该在应该显示5之后显示两次Student1,但是由于它们具有相同的值,因此它寻找的第一个值等于它。

我正在寻找解决方案,并且试图创建一个变量来检查索引是否已被访问:

    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 :(得分:0)

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}