我有2个列表,我想按特定顺序将数据添加到2维数组中,以成功在JTable中显示数据。
这就是我初始化JTable的方式:table = new JTable(data, columnNames);
数据变量是二维数组,columnNames是固定的,不能考虑。
我从地图中为键添加了两个单独列表中的值:
List<String> keyWords = new ArrayList<String>();
List<Long> valueFrequency = new ArrayList<Long>();
for (Map.Entry<String,Long> entry : counts.entrySet())
{
keyWords.add(entry.getKey());
valueFrequency.add(entry.getValue());
}
这按预期工作!
现在数据变量应如下所示(示例)
Object[][] data = {{"James", 3}, {"Hello", 2}};
。当我像这样进行硬编码时,这些元素将按预期在Jtable中显示。
现在,我要动态地通过添加列表keyWords的第一个元素(在我们的例子中为“ James”)和列表valueFrequency的第一个元素(在我们的例子中为3)中添加数字来动态地实现相同的效果。现在,在“ Hello”位置添加列表关键字的第二个元素,在数字2位置添加列表velueFrequency的第二个元素,依此类推。两个列表的大小始终相同。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
从地图上
使用Stream
Object[][] data = counts.entrySet()
.stream().map(e -> new Object[]{e.getKey(),e.getValue()})
.toArray(Object[][]::new);
使用for-i
循环
Object[][] data = new Object[counts.size()][];
int i = 0;
for (Map.Entry<String, Long> entry : counts.entrySet()) {
data[i++] = new Object[]{entry.getKey(), entry.getValue()};
}
在两个列表中:
使用Stream
Object[][] data = IntStream.range(0, keyWords.size())
.mapToObj(i -> new Object[]{keyWords.get(i), valueFrequency.get(i)})
.toArray(Object[][]::new);
使用Guava Streams
Object[][] data = Streams.zip(keyWords.stream(), valueFrequency.stream(), (s, l) -> new Object[]{s, l})
.toArray(Object[][]::new);
使用for-i
循环
Object[][] data = new Object[keyWords.size()][];
for (int i = 0; i < keyWords.size(); i++) {
data[i] = new Object[]{keyWords.get(i), valueFrequency.get(i)};
}