对 'LinkedHashMap.get' 的可疑呼叫
Suspicious call to 'LinkedHashMap.get'
您好,我有以下代码
public static LinkedHashMap<Object, String[]> dataMap = new LinkedHashMap<>();
public static void parseDataset(int line){
String[] dataArr = dataMap.get(dataMap.keySet().toArray()[line]);
}
由于我用作键的对象是动态生成的,我对此一无所知,所以我必须先找到它,然后才能使用它来获取它的值。
此代码向我发出警告 对 'LinkedHashMap.get' 的可疑调用,这是一个问题吗?我该如何消除警告?
您不需要使用 get
:不要将键转换为数组,而是使用 values()
。这是有效的,因为 values()
以与相应的 keys()
:
相同的顺序迭代
String[] dataArr = (String[]) dataMap.values().toArray()[line];
但是您也不需要使用 toArray()
,它会浪费地分配一个包含所有值的数组,而您只需要一个值:您可以遍历这些值来获得您想要的东西:
static String[] nthItem(int n) {
int i = 0;
for (String[] value : dataMap.values()) {
if (i == n) return value;
++i;
}
throw new ArrayIndexOutOfBoundsException();
}
或:
String[] dataArr = dataMap.values().stream().skip(line).findFirst().orElseThrow();
(这类事情的现有实现可以在 commonly-used 库中找到,例如 Guava's Iterables.get
)
您好,我有以下代码
public static LinkedHashMap<Object, String[]> dataMap = new LinkedHashMap<>();
public static void parseDataset(int line){
String[] dataArr = dataMap.get(dataMap.keySet().toArray()[line]);
}
由于我用作键的对象是动态生成的,我对此一无所知,所以我必须先找到它,然后才能使用它来获取它的值。
此代码向我发出警告 对 'LinkedHashMap.get' 的可疑调用,这是一个问题吗?我该如何消除警告?
您不需要使用 get
:不要将键转换为数组,而是使用 values()
。这是有效的,因为 values()
以与相应的 keys()
:
String[] dataArr = (String[]) dataMap.values().toArray()[line];
但是您也不需要使用 toArray()
,它会浪费地分配一个包含所有值的数组,而您只需要一个值:您可以遍历这些值来获得您想要的东西:
static String[] nthItem(int n) {
int i = 0;
for (String[] value : dataMap.values()) {
if (i == n) return value;
++i;
}
throw new ArrayIndexOutOfBoundsException();
}
或:
String[] dataArr = dataMap.values().stream().skip(line).findFirst().orElseThrow();
(这类事情的现有实现可以在 commonly-used 库中找到,例如 Guava's Iterables.get
)