从LinkedHashMap中将地图值提取为ArrayList

时间:2017-09-09 01:44:45

标签: java android listview arraylist collections

我创建了一个简单的类MapExtension,以容纳将4个值传递给listview适配器,并使用LinkedHashmap添加MapExtension的ArrayList。

public class MapExtension {
private String studname;
private String studnumber;
private String schedule;


public MapExtension(String studname, String studnumber, String schedule) {
    this.studname = studname;
    this.studnumber= studnumber;
    this.schedule= schedule;
}

public String getStudname () {
    return studname;
}

public String getStudnumber() {
    return studnumber;
}

public String getSchedule() {
    return schedule;
}

}

每当我尝试从LinkedHashMap中提取ArrayList<MapExtension>并返回Collections时,我会从不同的试验中获得这些错误(在评论中):

ListViewAdapter(Context context, LinkedHashMap<Integer, ArrayList<MapExtension>> mValues) {
    super(context, R.layout.listview_layout, mValues.keySet().toArray());
    this.context = context;

    //java.lang.ClassCastException: java.util.HashMap$Values 
    //cannot be cast to java.util.ArrayList
    ArrayList mValues = (ArrayList) mValues.values();

    // says incompatible as it will become ArrayList<ArrayList<MapExtension>>
    ArrayList<MapExtension> mValues = new ArrayList<>(mValues.values());      
}

如何成功检索并放置在兼容类型中?

提前致谢。

2 个答案:

答案 0 :(得分:1)

value的每个mValues都是ArrayList<MapExtensions>,而values会返回Collection<V>,所以您应该可以这样做..

Collection<ArrayList<MapExtensions>> localVar = mValues.values();

如果要展平嵌套数组,可以查看流flatMap()方法。 Here is one person's blog on that。 BTW,Kotlin集合有一个flatMap()扩展方法,适用于集合。

答案 1 :(得分:1)

如果我理解你,给定LinkedHashMap<Integer, ArrayList<MapExtension>> mValues,您希望ArrayList<MapExtension>展平输入地图的值。使用Java 8,您可以轻松地执行此操作:

ArrayList<MapExtension> extensions = mValues .values() .stream() .collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);

小提示:您应该针对接口进行编程,而不是在类型中使用ArrayList,请考虑使用List,这样您就无法在任何地方使用某个特定的具体实现。