如何将适当的费用应用于排名较高的选择

时间:2019-04-23 04:25:33

标签: java arraylist ranking

我有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,其第一选择为活动2,其成本为1。他们的第二选择为活动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);
 }
}

只是一些额外的上下文 然后,成本清单将用于填充运输问题网格,其中源由活动表示,如下所示。网格中的源位于固定位置,因此在看人1时。活动2是他们的第一选择,活动3是他们的第二选择,活动1是他们的第三选择,活动4是他们的第四选择。

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

我对如何应用它感到困惑,因为它应该很简单。在我之前的实现中,我最终只获得了1,2,3,4的成本清单。由于某种原因,我无法全神贯注于这个理论(可能是因为它的XD上午5点)。 我愿意接受任何理论或伪代码。 预先谢谢你!

2 个答案:

答案 0 :(得分:0)

我正在编写示例代码。根据您对问题的理解,我已经为您编写了代码。

人员班

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

如果某人的一项活动的成本是其在选择中的位置,则可以在Person类中声明一个方法costOf

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

所期望的。