2013-08-29 2 views
1

Я новичок в использовании класса Collections.Как перечислить числа после сортировки в java

Я хочу, чтобы отсортировать кучу экзаменационных оценок в порядке убывания, позволяет сказать (430,400,372,500), а затем отображать номера (System.out.println()) в порядке заслуг, так что 500 марка получает позицию 1, 430marks получить позиции 2 и т.д.

Как это сделать?

+0

Посмотрите отличный учебник Ларса Фогеля в [Java Collections ] (http://www.vogella.com/articles/JavaCollections/article.html#collectionssort). – Jost

+0

проверить эту ссылку http://stackoverflow.com/questions/5894818/how-to-sort-arraylistlong-in-java-in-decreasing-order – dthien

ответ

11

Существует несколько возможных способов достижения этого.

Предполагая, что мы имеем List следующим образом ...

List<Integer> marks = new ArrayList<>(5); 
marks.add(430); 
marks.add(400); 
marks.add(372); 
marks.add(500); 

Вы могли бы просто сделать ...

Collections.sort(marks); 
int row = 0; 
for (Integer mark : marks) { 
    System.out.println((++row) + ": " + mark); 
} 

Этот выход будет ...

1: 372 
2: 400 
3: 430 
4: 500 

Но ждать , это не то, что мы хотим!

Но с отсортированного списка, мы можем сделать ...

Collections.reverse(marks); 
row = 0; 
for (Integer mark : marks) { 
    System.out.println((++row) + ": " + mark); 
} 

Какие выходы ...

1: 500 
2: 430 
3: 400 
4: 372 

Намного лучше: D

Теперь, если это кажется на много работы, вы также можете использовать Comparator, чтобы изменить способ сортировки товаров ...

Collections.sort(marks, new Comparator<Integer>() { 
    @Override 
    public int compare(Integer o1, Integer o2) { 
     return (o2 - o1); 
    } 
}); 

Который будет производить список в следующем порядке ...

1: 500 
2: 430 
3: 400 
4: 372 

Обновлено

На основании ответа от Iterating through a list in reverse order in java, вы можете также сделать обратные итерации списка, если все, что вы хотите сделать, это отобразить результат (спасибо Борису паука)

Collections.sort(marks); 
int row = 0; 
ListIterator li = a.listIterator(a.size()); 
while(li.hasPrevious()) { 
    System.out.println(li.previous()); 
} 

Обновлено Wi го строения

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

List<Integer> marks = new ArrayList<>(Arrays.asList(new Integer[]{430, 400, 372, 400, 500})); 
Collections.sort(marks, new Comparator<Integer>() { 
    @Override 
    public int compare(Integer o1, Integer o2) { 
     return (o2 - o1); 
    } 
}); 
int row = 0; 
int last = -1; 
for (Integer mark : marks) { 
    if (mark != last) { 
     row++; 
    } 
    System.out.println(row + ": " + mark); 
    last = mark; 
} 

Какие выходы ...

1: 500 
2: 430 
3: 400 
3: 400 
4: 372 

Теперь, если вы хотите к выходу, чтобы больше походить ...

1: 500 
2: 430 
3: 400 
3: 400 
5: 372 // Not the skipped line... 

Вам нужно знать, сколько раз индивидуальная метка была сопоставлена ​​и увеличивать «ряд» соответственно ...

int row = 0; 
int last = -1; 
int matches = 1; 
for (Integer mark : marks) { 
    if (mark != last) { 
     row += matches; 
     matches = 1; 
    } else { 
     matches++; 
    } 
    System.out.println(row + ": " + mark); 
    last = mark; 
} 
+1

Вы всегда можете прокручивать назад, а не 'обращать'' Collection', если только цель - распечатать назад. Это тривиально, используя ['ListIterator'] (http://stackoverflow.com/a/2102552/2071828). –

+0

thanx много. Что, если два или более ученика свяжутся с одинаковыми отметками ... будут ли цифры соответствовать? например (421,421,416,430), выход будет (1,2,2,4)? –

+0

Знаки будут размещаться по порядку, но номер строки будет по-прежнему увеличиваться. Они были только для показательных целей. – MadProgrammer

0

Попробуйте Collections.sort, Collections.reverse

Collections.sort(sampleList); 
Collections.reverse(sampleList); 

Первый Collection.sort() устроит заказ assending. И использование Collection.reverse() приведет к тому, что все значения списка будут отменены.

+0

Этот ответ был предоставлен уже и более подробно, как вы думаете, ваш ответ добавляет к этому вопросу? –

+0

@BoristheSpider Если вы так думаете, каждый вопрос будет иметь только один ответ. Я пробовал и писал. Так что требуется некоторое время – newuser

0

Просто вы можете использовать этот

я предполагаю, что вы имеете array(int type) of marks

int MarksArr[] = { 421,421,416,430 }; // Array of your All Marks 

     List<Integer> marks = new ArrayList<Integer>(); 
     for (int i = 0; i < MarksArr.length; i++) 
      marks.add(MarksArr[i]); 

     Collections.sort(marks);// this Will Sort in Acceding order 
     Collections.reverse(marks);// this will reverse the ArrayList (Descending order) 

    // Will Also Handle the Tie Case as per Your Comment o/p for position should be 1,2,2,4 
    for (int i = 0; i < marks.size(); i++) { 
     int pos = -1; 
     if (i != 0) 
      if (marks.get(i - 1).equals(marks.get(i))) 
       pos = i; 
      else 
       pos = i+1; 

     else { 
      pos = i + 1; 
     } 

     System.out.println("Pos :" + pos + " Marks:" + marks.get(i)); 
    } 

Выход:

Pos :1 Marks:430 
Pos :2 Marks:421 
Pos :2 Marks:421 
Pos :4 Marks:416 
+2

'new ArrayList (Collections.asList (MarksArr))' ... – MadProgrammer

+0

Или даже с 'static' import,' new ArrayList (asList (new int [] {430, 400, 372, 500})) '! –

+0

Справедливая точка должна быть ['Arrays.asList'] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList (T ...)). –

Смежные вопросы