#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. Это тоже работает! Большое вам спасибо за вашу помощь, Яниш!