-1

下面的代码是 Android 应用程序活动的一部分。我正在使用 Jena(Androjena) 来查询 rdf 文件。那部分工作正常。问题是我试图遍历结果并将其存储在二维数组中。列和行应该是这样的:

/////////////////
Adam /Sandler/43
Kate /Sandler/22  
Mike /Jasonss/13   
/////////////////

代码:

enter code here

// Query uses an external SPARQL endpoint for processing
            // This is the syntax for that type of query
        QueryExecution qe = QueryExecutionFactory.sparqlService(sparqlEndpointUri, query);

        // Execute the query and obtain results
        ResultSet resultSet = qe.execSelect();

        // Setup a place to house results for output
        StringBuffer results = new StringBuffer();

        // Get the column names (the aliases supplied in the SELECT clause)
        List<String> columnNames = resultSet.getResultVars();
        int i=0;
        int j=0;

        String results1[][] = new String[i][j];


   // Iterate through all resulting rows

        while (resultSet.hasNext()) {
            // Get the next result row
            QuerySolution solution = resultSet.next();

            results1  = new String[i][columnNames.size()];
            // Iterate through the columns
            for (String var : columnNames) {

                // Add the column label to the StringBuffer
                results.append(var + ": ");

                // Add the returned row/column data to the StringBuffer

                // Data value will be null if optional and not present
                if (solution.get(var) == null) {
                    results.append("{null}");
                // Test whether the returned value is a literal value
                } else if (solution.get(var).isLiteral()) {
                    results.append(solution.getLiteral(var).toString());

                    results1[resultSet.getRowNumber()][j]=solution.getLiteral(var).toString();
                    j++;
                // Otherwise the returned value is a URI
                } else {
                    results.append(solution.getResource(var).getURI().toString());

                    results1[resultSet.getRowNumber()][j]=solution.getResource(var).getURI().toString();
                    j++;
                }
                results.append('\n');

            }
            results.append("-----------------\n");
            i++;
        }

PS。忽略字符串缓冲区。

4

2 回答 2

2

由于您事先不知道结果集的大小,因此您不能使用数组。当您从结果集中读取行时, 请使用 anArrayList<String[]>并将元素添加到列表中。String[]

ArrayList<String[]> results1 = new ArrayList<>();

阅读完所有行后,如果需要,您仍然可以按索引引用行和列,使用

results1.get(index)[colIndex]
于 2013-06-19T22:19:31.803 回答
0

问题是您创建的数组实际上String results1[][] = new String[i][j];String results1[][] = new String[0][columnNames.size()];

然后在for (String var : columnNames)循环中增加 i 的值并尝试将元素设置为results1[resultSet.getRowNumber()][j].

上面你说它是一个0,columnNames.size()数组,并且在循环中你尝试访问resultSet.getRowNumber(), j. j在这里是合法的,但resultSet.getRowNumber()不是。

于 2013-06-19T22:02:43.033 回答