将 vector<Vector> 转换为字符串数组或 String[][]

Conversion of Vector<Vector> to a String Array or a String[][]

提问人:Edelweiss Monville 提问时间:11/15/2023 更新时间:11/17/2023 访问量:72

问:

我有一个 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 
            }
        });
java 向量 jtable

评论

0赞 Reilas 11/15/2023
你只需要一个循环

答:

0赞 Old Dog Programmer 11/15/2023 #1

在对象上使用时确实存在问题。之所以出现这种情况,是因为您尝试搜索的可能是 ,但 的每个元素都不是 .每个元素都是另一个。该变量本质上是一个 2D 向量。因此,正在搜索与一行相同的 ,因此将始终返回。containsdataStringdataStringVectordatadata.contains(pn)StringVectorsfalse

打个比方:想想看一个案例。箱子里装着几盒糖果。但是,缺少糖果类型的列表。您想了解箱子中是否装有任何焦糖糖果。问题中使用的代码就像翻箱倒柜,一次挑出一盒,然后问“这个盒子是一块焦糖吗?要确定箱子里是否有焦糖糖,您需要打开每个盒子,然后检查该盒子中的每件。datadata.contains(pn)

要访问 的单个元素,您需要使用两个索引。请参阅 API 中的示例Vector<Vector>

因此,要搜索特定的 ,您需要使用嵌套循环逐个元素搜索,或者在循环中使用。Stringcontains

以下方法可用于查找目标出现的第一个位置:这将在循环中使用该方法。它返回一个包含两个元素的元素:一个用于外部索引,另一个用于内部索引:String.containsint []

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};
}

其他问题是:

元素不一定是 .因此,不一定是 的每个元素都是 .假设 的元素可能是 .假设您的代码正在寻找对应于 的元素。碰巧的是,实际上与 相关联,因为它的方法返回 。第一个版本将不起作用。重构版本通过使用方法解决了这个问题。JTableStringdataStringdataFoodata"Eleven"ElevenFootoString()"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]);
    ...

评论

0赞 Edelweiss Monville 11/17/2023
非常感谢您的全面解决方案。只有一个故障。Java 不接受比较,这是 println 的参数。我相信比较是具有两个元素和标量的向量之间的比较
0赞 Old Dog Programmer 11/17/2023
哎呀 -- 那句话缺少一个下标:printlnSystem.out.println(indexOf (data, pn)[0] != -1);
0赞 Edelweiss Monville 11/18/2023
不用担心。你的代码非常好。再次感谢您的帮助。
0赞 Edelweiss Monville 11/24/2023
您的代码是否可以用于从只有一列的 JTable 中提取数据?谢谢
0赞 Old Dog Programmer 11/24/2023
@EdelweissMonville,当然。您仍然有一个 .但是,循环 for 只会迭代一次。index 的唯一有效值是 。Vector<Vector>outerouter0
0赞 Old Dog Programmer 11/16/2023 #2

在我的另一个答案中,我试图解释如何在变量中搜索特定值,我认为这是您实际提出的问题。相反,此答案会解决问题标头,并忽略问题正文。StringdataVector<Vector> data = linesTableModel.getDataVector();

请记住,每个元素都是另一个元素,您可以使用嵌套循环将其内容转换为二维数组。下面是此类方法的代码:dataVectorVector

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;
}

与前面的答案一样,这用于允许 中的元素不一定是对象的可能性。toStringdataString