Как применить соответствующие затраты к ранжированным выборам

#java #arraylist #ranking

#java #arraylist #Рейтинг

Вопрос:

У меня есть список из 4 вариантов действий

 Activities
Activity 1
Activity 2
Activity 3
Activity 4
  

И у меня есть список людей, которые выбрали 4 вида деятельности, ранжированные по порядку, например

 Person    Choices (1st,2nd,3rd,4th)
Person 1  2,3,1,4
Person 2  3,1,4,2
...
  

Я пытаюсь распределить затраты на ранжированные варианты на основе их положения, и мне просто интересно, как я мог бы это сделать.
Примером является пользователь 1, чей 1-й выбор — это действие 2, а стоимость для этого равна 1. Их 2-й выбор — это действие 3, а стоимость равна 2, потому что оно находится на позиции 2 и так далее.
Я добавляю эти затраты в списки, потому что мне нужен этот список затрат позже в том же порядке.

Код, который я пробовал

 List<Integer> cost = new ArrayList<Integer>();
for(Person p: people){
 for (int i = 0; i < p.getChoices().size(); i  ) {

  cost.add(p.getChoices(i 1);
 }
}

  

Просто некоторый дополнительный контекст
Затем список затрат будет использоваться для заполнения таблицы транспортных проблем, где источники представлены действием, как показано ниже. Источники в сетке находятся в фиксированных позициях, поэтому при взгляде на person 1. Упражнение 2 было их 1-м выбором, упражнение 3-м, упражнение 1-3-м, а упражнение 4-м.

   Person 1 | Person2 | Person n
1     3         2
2     1         4
3     2         1
4     4         3
  

Я продолжаю путаться в том, как применить это, поскольку это должно быть просто. В моих предыдущих реализациях я получаю только список затрат из 1,2,3,4 непрерывно. По какой-то причине я не могу разобраться в теории (вероятно, потому что сейчас 5 утра XD).
Я открыт для любой теории или псевдокода.
Заранее благодарю вас!

Комментарии:

1. Я открыт для вас, показывая, что вы пробовали до сих пор

2. Это такая мелочь, но она мешает мне интегрировать другие, более сложные части моего кода в мое программное обеспечение:(

3. Спасибо! Я отредактирую код в вопросе. Дайте мне секунду.

4. @Scary Wombat Это действительно базовый (код, который я добавил). Если это быстро и легко для вас, я был бы признателен за помощь. Но, вероятно, лучше всего лечь спать и повторить попытку днем

5. Ваш код не будет компилироваться, но, возможно, вы хотите cost.add(s.getChoices.get(i));

Ответ №1:

Если стоимость действия для пользователя является его позицией в выборках, вы можете объявить метод costOf в классе Person:

 public class Person {
    private final List<Integer> choices = new ArrayList<>();

    public Person(Integer... choices) {
        this.choices.addAll(Arrays.asList(choices));
    }

    public List<Integer> getChoices() {
       return choices;
    }

    public int costOf(Integer activity) {
        return choices.indexOf(activity) 1;
    }
}
  

Чтобы распечатать таблицу, вы должны сделать это:

     List<Person> persons = Arrays.asList(
                new Person(2,3,1,4),
                new Person(3,1,4,1)
            );
    // Print grid
    for (int activity = 1; activity <= 4;   activity) {
        System.out.print(activity);
        for (Person p: persons) {
            System.out.print(" ");
            System.out.print(p.costOf(activity));
        }
        System.out.println();
    }
  

Это выведет:

 1 3 2
2 1 0
3 2 1
4 4 3
  

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

Предполагая, что это опечатка, и вы заменяете второе 1 на 2, вы получаете:

 1 3 2
2 1 4
3 2 1
4 4 3
  

Чего и ожидалось.

Комментарии:

1. Да, извините за опечатку. Это оно! Большое вам спасибо за вашу помощь и время!

Ответ №2:

Я пишу пример кода. Я написал для вас код в соответствии с моим пониманием вашего вопроса.

Класс Person

 import java.util.ArrayList;

public class Person {
    ArrayList<Integer> choices = new ArrayList<>();

    public ArrayList<Integer> getChoices() {
       return choices;
    }

    public void setChoices(ArrayList<Integer> choices) {
       this.choices = choices;
    }
}
  

Основной метод

 public class MainMethod {

    public static void main(String[] args) {

       Person person1 = new Person();
       ArrayList<Integer> activity1 = new ArrayList<>();
       activity1.add(2);
       activity1.add(3);
       activity1.add(1);
       activity1.add(4);
       person1.setChoices(activity1);

       Person person2 = new Person();
       ArrayList<Integer> activity2 = new ArrayList<>();
       activity2.add(2);
       activity2.add(4);
       activity2.add(1);
       activity2.add(3);
       person2.setChoices(activity2);

       Person person3 = new Person();
       ArrayList<Integer> activity3 = new ArrayList<>();
       activity3.add(1);
       activity3.add(3);
       activity3.add(4);
       activity3.add(2);
       person3.setChoices(activity3);

       Person person4 = new Person();
       ArrayList<Integer> activity4 = new ArrayList<>();
       activity4.add(4);
       activity4.add(3);
       activity4.add(1);
       activity4.add(4);
       person4.setChoices(activity4);

       ArrayList<Person> persons = new ArrayList<>();
       persons.add(person1);
       persons.add(person2);
       persons.add(person3);
       persons.add(person4);

       int i = 1;
       for(Person person :persons) {
           System.out.println("Person" i);
           //List
           person.getChoices().forEach(System.out::println);
           i  ;
       }
       System.out.println("**********************");
       //If you need cost list. I gave you option to store in list as well.
       int j = 1;
       for(Person person :persons) {
        System.out.println("Person" j);
        ArrayList<Integer> cost = person.getChoices();
        cost.stream().forEach(System.out::println);
        i  ;
       }
   }
}
  

Если ваши требования отличаются, пожалуйста, уточните и дайте мне знать.

Комментарии:

1. Это тоже работает! Большое вам спасибо за вашу помощь, Яниш!