Ранжирование альтернатив в зависимости от их оценки с их именами - PullRequest
0 голосов
/ 06 мая 2018

Я хочу ранжировать некоторые альтернативы в зависимости от их оценки и напечатать название каждой альтернативы с ее рейтингом, как мне это сделать?

Вот MWE:

import java.util.Arrays;
public class Ranking {
public static void main(String[] args) {

//The score of the alternatives :
double [] score = new double [4] ;
score[0] = 6.75 ;
score[1] = 9.0 ;
score[2] = 6.75 ;
score[3] = 5.50;

//The name of the alternatives :
String [] name = new String [4] ;
name[0] = "a1";
name[1] = "a2";
name[2] = "a3";
name[3] = "a4";

//Descending Sorting the score array like this :
for(int i=0;i<4;i++)
score[i]= - score[i];

Arrays.sort(score);

for(int i=0;i<4;i++)
score[i]= - score[i];

//print the result
for(int i=0;i<4;i++)
System.out.println(score[i] + " rank = " + (i+1));
}
//result :
//9.0 rank = 1
//6.75 rank = 2
//6.75 rank = 3
//5.5 rank = 4

Но я хочу такой результат:

name : a2 a1 a3 a4
rank : 1  2  3  4

Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Вы должны использовать Map<String, Double> для этого.

Попробуйте приведенный ниже пример:

Map<String, Double> map = new HashMap<>();
      map.put("a1", 6.75);
      map.put("a2", 9.0);
      map.put("a3", 6.8);

      map = map.entrySet().stream()
      .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
      .collect(Collectors.toMap(
         Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

//Iterate through the map

Вы получите ответ в обратном порядке.

.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) используется для сортировки по значениям, а LinkedHashMap::new используется для поддержания порядка Map

0 голосов
/ 06 мая 2018

Когда вам нужно что-то отсортировать, вы должны посмотреть на TreeSet или TreeMap структуры. На самом деле Array не там, где сортировка является основной функцией.

Похоже, что у вас есть уникальный names для всех объектов, тогда вы должны использовать TreeSet с реверсным компаратором. В результате, когда вы перебираете Set, вы получаете необходимый заказ:

final class Model {

    private final String name;
    private final double score;

    public Model(String name, double score) {
        this.name = name;
        this.score = score;
    }
}

final Comparator<Model> reverceScore = (d1, d2) -> {
    if (d1.name.equalsIgnoreCase(d2.name))
        return 0;

    int res = Double.compare(d2.score, d1.score);
    return res != 0 ? res : d1.name.compareTo(d2.name);
};

Set<Model> data = new TreeSet<>(reverceScore);
data.add(new Model("a1", 6.75));
data.add(new Model("a2", 9));
data.add(new Model("a3", 6.75));
data.add(new Model("a4", 5.5));

int rank = 1;

for(Model model : data)
    System.out.println("rank: " + rank++ + " - name: " + model.name + ", score: " + model.score);
0 голосов
/ 06 мая 2018

Вы сортируете отдельный массив, чтобы результат не мог быть отображен между именем и рангом.

В Java обычный способ состоит в том, чтобы абстрагировать ваши данные в объект и работать с ними:

Объявите свой модельный класс:

public YourModel {
  private String name;
  private double score;

  public Rank(String name, double score) {
    this.name = name;
    this.score = score;
  }
  // you create your getters/ setters
}

Добавить данные в ваш массив:

YourModel[] models = new YourModel[4];
models[0] = new YourModel("a1", 6.75D);

... добавить другие модели ...

Сортируйте массивы:

Arrays.sort(models, Comparator.comparing(YourModel::getScore));

После этого шага ваш массив будет отсортирован:

[{"a2", 9.0} ....]

И вы можете распечатать свой результат:

for(int i=0;i<4;i++)
   System.out.println(models[i].getName() + " rank = " + (i+1));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...