通过整数值检索字符串值

时间:2016-12-11 07:13:40

标签: java

我有一个带有元素的Integer ArrayList,例如60,45,60,15 - 这些是活动时间。这些元素中的每一个都具有关联的活动名称。例如。活动A的时间为60,活动B的时间为45,等等。

如何在Java中编写给定整数值的函数,可以返回Activity Name吗?最初我认为HashMap是正确的,但由于分钟可以重复,它会覆盖前一个值,如果相同,我对实现类似于Guava集合的MultiValueMap的自定义Map不感兴趣。

实现此目的的任何线索都有帮助。

编辑1:

我按照Wasi的建议尝试实现 - 但是,我得到了IndexOutOfBoundsException。我期待来自mapping60的活动,来自mapping15的1个活动,以及来自mapping45的1个活动。我做错了什么?

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MultiMapTest {

public static void main(String[] args) {

    Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();

    List<String> activityMappings60 = new ArrayList<String>();
    activityMappings60.add("Act 1 60min");
    activityMappings60.add("Act 2 60min");

    List<String> activityMappings15 = new ArrayList<String>();
    activityMappings15.add("Act 3 sprint");
    activityMappings15.add("Act 4 sprint");

    List<String> activityMappings45 = new ArrayList<String>();
    activityMappings45.add("Act 5 45min");
    activityMappings45.add("Act 6 45min");


    map.put(new Integer(60), activityMappings60 );
    map.put(new Integer(15), activityMappings15 );
    map.put(new Integer(45), activityMappings45 );

    List<Integer> arrayInteger = Arrays.asList(60,60,15,45);

    for(Integer i=0; i < arrayInteger.size();i++) {
        System.out.println(map.get(arrayInteger.get(i)).get(i));
        System.out.println(map.get(arrayInteger.get(i)).remove(i));
    }

}

3 个答案:

答案 0 :(得分:2)

我想这就是你要找的东西。

public static void main(String[] args) {
    HashMap<Integer, ArrayList<String>> duration_to_activity_map = new HashMap<>();

    ArrayList<String> activityList = new ArrayList<>();
    activityList.add("A");
    activityList.add("B");
    duration_to_activity_map.put(30, activityList);

    activityList = new ArrayList<>();
    activityList.add("C");
    activityList.add("D");
    duration_to_activity_map.put(60, activityList);

    System.out.println(duration_to_activity_map.toString());
}

打印:

{60=[C, D], 30=[A, B]}

因此,如果您希望活动的持续时间为60,则会为您提供[C, D]

System.out.println(duration_to_activity_map.get(60)); // prints - [C, D]

ArrayList 中删除元素:请参阅此tutorial。但正如@cainiaofei所说,LinkedListList接口的更好选择,因为您需要删除元素。

答案 1 :(得分:1)

代码中唯一的问题是当从活动列表中获取和删除时,您不应该使用i。使用0代替总是获取和删除第一个元素。这应该在你的循环中起作用:

List<String> list = map.get(arrayInteger.get(i));
    if (list != null && !list.isEmpty()) {
        System.out.println(list.remove(0));
}

我得到的输出:

Act 1 60min
Act 2 60min
Act 3 sprint
Act 5 45min

我使用的全部内容:

public static void main(String[] args) {
    Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();

    List<String> activityMappings60 = new ArrayList<String>();
    activityMappings60.add("Act 1 60min");
    activityMappings60.add("Act 2 60min");

    List<String> activityMappings15 = new ArrayList<String>();
    activityMappings15.add("Act 3 sprint");
    activityMappings15.add("Act 4 sprint");

    List<String> activityMappings45 = new ArrayList<String>();
    activityMappings45.add("Act 5 45min");
    activityMappings45.add("Act 6 45min");

    map.put(new Integer(60), activityMappings60);
    map.put(new Integer(15), activityMappings15);
    map.put(new Integer(45), activityMappings45);

    List<Integer> arrayInteger = Arrays.asList(60, 60, 15, 45);

    for (Integer i = 0; i < arrayInteger.size(); i++) { // inside loop I use my code as above
        List<String> list = map.get(arrayInteger.get(i));
        if (list != null && !list.isEmpty()) {
            System.out.println(list.remove(0));
        }
    }

}

答案 2 :(得分:0)

就像 Wasi Ahmad 一样,您可以使用 Map&lt; Integer,List&gt; ,因为您可能经常进行删除操作,我认为使用LinkedList更好。

这是一个演示:

public void demo(){
    Map<Integer,List<String>> map = new HashMap<Integer,List<String>>();
    List<String> innerList = new LinkedList<String>();
    innerList.add("d1");
    innerList.add("d2");
    map.put(60, innerList);
    System.out.println(map.get(60).remove(0));
    System.out.println(map.get(60).remove(0));
}