我有一个带有元素的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));
}
}
答案 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所说,LinkedList是List接口的更好选择,因为您需要删除元素。
答案 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));
}