提问人:Edelweiss Monville 提问时间:11/15/2023 更新时间:11/17/2023 访问量:72
将 vector<Vector> 转换为字符串数组或 String[][]
Conversion of Vector<Vector> to a String Array or a String[][]
问:
我有一个 JTable,只包含一列 ,称为 “点” 点
我还有另一个 JTable,其中包含七列 ,称为 “Lines” Lines
我正在编写一个按钮处理程序,它删除了 Points 中在 Lines 中找不到的每个点(行),因为它没有被利用。
一次提取一个点(行)的点的内容。 我理想地将 Lines 的全部内容提取到字符串数组中。不幸的是,我与 Lines 一起使用的方法输出了一个 Vector。我找不到从 Vector 转换为 String Array 或类似数据类型的方法。 我的目标是在不使用嵌套循环的情况下,在线搜索点中的单个点。 我尝试了以下说明,但它们不起作用。大概是因为“contains()”方法在搜索 Vector 时不起作用。 我将不胜感激一些建议。先谢谢你。
我尝试了以下方法:
btnDeleteUnused.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Vector<Vector> data = linesTableModel.getDataVector();
for(int k = pointsTableModel.getRowCount() - 1; k >= 0; k--)
{
String pn = (String) pointsTableModel.getValueAt(k, 0); // Fetch Point Name at (k_th row, column 0)
System.out.println("Current Point: "+ pn);
System.out.println(data.contains(pn));
}
// TO BE DEVELOPED
}
});
答:
在对象上使用时确实存在问题。之所以出现这种情况,是因为您尝试搜索的可能是 ,但 的每个元素都不是 .每个元素都是另一个。该变量本质上是一个 2D 向量。因此,正在搜索与一行相同的 ,因此将始终返回。contains
data
String
data
String
Vector
data
data.contains(pn)
String
Vectors
false
打个比方:想想看一个案例。箱子里装着几盒糖果。但是,缺少糖果类型的列表。您想了解箱子中是否装有任何焦糖糖果。问题中使用的代码就像翻箱倒柜,一次挑出一盒,然后问“这个盒子是一块焦糖吗?要确定箱子里是否有焦糖糖,您需要打开每个盒子,然后检查该盒子中的每件。data
data.contains(pn)
要访问 的单个元素,您需要使用两个索引。请参阅 API 中的示例。Vector<Vector>
因此,要搜索特定的 ,您需要使用嵌套循环逐个元素搜索,或者在循环中使用。String
contains
以下方法可用于查找目标出现的第一个位置:这将在循环中使用该方法。它返回一个包含两个元素的元素:一个用于外部索引,另一个用于内部索引:String.
contains
int []
public static int [] indexOf (Vector<Vector> theVector, String target) {
for (int outer = 0; outer < theVector.size (); outer++) {
int inner = theVector.get(outer).indexOf (target);
if (inner >= 0) {
return new int [] {outer, inner};
}
}
return new int [] { -1, -1};
}
下面是一个重构的方法。该代码不使用 ,而是显示如何访问每个元素。该代码使用了一些中间变量,这应该使其更易于理解。indexOf (Vector<Vector> theVector, String target)
contains
它还修复了另一个问题,该问题在代码示例之后进行了说明:
public static int [] indexOf (Vector<Vector> vectorVector, String target) {
for (int outer = 0; outer < vectorVector.size (); outer++) {
Vector rowVect = vectorVector.get(outer);
for (int inner = 0; inner < rowVect.size(); inner++) {
Object obj = rowVect.get(inner);
if (obj.toString().equalsIgnoreCase (target)) {
return new int [] { outer, inner};
}
}
}
return new int [] { -1, -1};
}
其他问题是:
元素不一定是 .因此,不一定是 的每个元素都是 .假设 的元素可能是 .假设您的代码正在寻找对应于 的元素。碰巧的是,实际上与 相关联,因为它的方法返回 。第一个版本将不起作用。重构版本通过使用方法解决了这个问题。JTable
String
data
String
data
Foo
data
"Eleven"
Eleven
Foo
toString()
"Eleven"
String#equals
请注意,重构版本实际上用于说明修订版使这成为可能。.equalsIgnoreCase
您的代码具有
System.out.println(data.contains(pn));
.
您可以使用上述方法,将该行更改为
System.out.println(indexOf (data, pn)[0] != -1);
当您开发更多代码时,您可以访问特定元素,如下所示:
int [] location = indexOf (data, pn);
if (location [0] >= 0) {
String foo = data.get(location[0]).get(location[1]);
...
评论
println
System.out.println(indexOf (data, pn)[0] != -1);
Vector<Vector>
outer
outer
0
在我的另一个答案中,我试图解释如何在变量中搜索特定值,我认为这是您实际提出的问题。相反,此答案会解决问题标头,并忽略问题正文。String
data
Vector<Vector> data = linesTableModel.getDataVector();
请记住,每个元素都是另一个元素,您可以使用嵌套循环将其内容转换为二维数组。下面是此类方法的代码:data
Vector
Vector
public static String [][] VectorToString2D (Vector<Vector> vect) {
String [][] result = new String [vect.size()][];
for (int rowIndex = 0; rowIndex < vect.size(); rowIndex++) {
Vector vectRow = vect.get(rowIndex);
String [] stringRow = new String [vectRow.size()];
for (int columnIndex = 0; columnIndex < vectRow.size(); columnIndex++) {
stringRow [columnIndex] = vectRow.get(columnIndex).toString();
}
result [rowIndex] = stringRow;
}
return result;
}
与前面的答案一样,这用于允许 中的元素不一定是对象的可能性。toString
data
String
评论