我有一个存储密钥和密钥的ArrayList。每行中的值(例如,第一行将具有no,firstname,lastname,age和第二行将具有1,xxx,yyy,23和第3行将具有2,aaa,bbb,24等等)。第一行包含所有键,其余行具有值。 我想将其转换为hashmap(例如,keys应该是firstname,值应该是xxx,aaa)。 有没有办法做到这一点??
答案 0 :(得分:0)
鉴于HashMap
变量在两个方面都是可扩展的(例如,您可以使列表更长,但您也可以使列表中的列表更长),并且假设Option Explicit
Sub FillEmptyWithDates()
Dim Cell1 As Range
Dim Range1 As Range
Set Range1 = ActiveWorksheet.Columns(7)
For Each Cell1 in Range1
If IsEmpty(Cell1.Value) = True Then
Cell1.Value = Date
End If
Next Cell1
End Sub
基本上有固定维度(一个键转到一个值,而不是多个),唯一的方法是创建一个包含列表数据的新对象,并将关键点指向该对象。
答案 1 :(得分:0)
这将返回一个HashMaps列表,这意味着对于每个值行,您将获得一个键值结构:
static List<HashMap<String, String>> listToMap(List<List<String>> lst){
List<HashMap<String, String>> lmap = new ArrayList<>();
List<String> keys = lst.get(0);
for(int row=1;row<lst.size();row++){
List<String> currentRow = lst.get(row);
HashMap<String, String> kvRow = new HashMap<String, String>();
for(int i=0;i<keys.size();i++){
kvRow.put(keys.get(i), currentRow.get(i));
}
lmap.add(kvRow);
}
return lmap;
}
如果您使用样本数据运行...
public static void main(String[] args) {
List<List<String>> lst = new ArrayList<>(3);
lst.add(Arrays.asList("no","firstname","lastname","age"));
lst.add(Arrays.asList("1","xxx","yyy","23"));
lst.add(Arrays.asList("2","aaa","bbb","24"));
System.out.println(listToMap(lst));
}
打印
[{no=1, age=23, lastname=yyy, firstname=xxx}, {no=2, age=24, lastname=bbb, firstname=aaa}]
这是你想要的吗?此代码假定所有值行的值至少与&#34;键&#34; -row一样多。
答案 2 :(得分:0)
假设您在范围内的某处定义了以下列表:
List<String> headers = keyValueList.get(0);
首先,轮询列表以获取标题。
Map<String, String> myMap = new HashMap<String, String>(headers.size());
ListIterator<List<String>> valueLists = keyValueList.listIterator(1);
while(valueLists.hasNext()){
Iterator<String> values = valueLists.next().iterator();
Iterator<String> keys = headers.iterator();
myMap.put(keys.next(), values.next());
}
然后,您可以使用ListIterator迭代所有值。
cloud
然后你就完成了。
答案 3 :(得分:-2)
因为你正在使用排序的ArrayLists,你可能想要使用像LinkedHashMap这样的有序地图,它会保留你插入它们的顺序。
List<List<String>> inputList;
LinkedHashMap<String, List<String>> map = new LinkedHashMap<String, List<String>>();
int nEntries = inputList.get(0).size();
String thisKey;
List<String> thisList;
for(int index = 0; i < nEntries; i++){ //iterate over all column indexes
for(List<String> thisRow:inputList){
//if this is the first row, this is our key.
if(inputList.indexOf(thisRow) == 0){
thisKey = thisRow.get(index);
thisList.clear();
}
else{
thisList.add(thisRow.get(index);
}
}
map.put(thisKey,thisList);
}