目的是从指定列返回一个干净的表,该表只包含其中包含数字数据的行。 下面的代码适合我。但我不禁觉得有更好的方法可以做到这一点。有关更优雅的解决方案的任何想法?
我有代码:
Table removeEmptyRows(Table data, String column_name)
{
IntList rows_to_remove = new IntList();
Table dataCopy = cloneTable(data);
for (int r = 0; r<dataCopy.getRowCount(); r++)
{
String value_string = dataCopy.getString(r, column_name);
///filter out the NaNs
if ( ! isNullOrBlank(value_string))
{
if ( ! isNumeric(value_string) )
{
rows_to_remove.append(r);
}
} else {
rows_to_remove.append(r);
}
}
rows_to_remove.sortReverse();
for (int r : rows_to_remove)
{
dataCopy.removeRow(r);
}
return dataCopy;
}
boolean isNumeric(String inputData) {
return inputData.matches("[-+]?\\d+(\\.\\d+)?");
}
private static boolean isNullOrBlank(String s)
{
return (s==null || s.trim().equals(""));
}
答案 0 :(得分:1)
这个问题可能更适合Code Review Stack Exchange(请注意,如果您在那里发帖,请在交叉点之间进行链接,并确保发布真实MCVE并明确指出这是一个处理,而不是Java问题),但我会尝试提供一些输入。
您可以通过添加好行而不是删除错误行来简化代码。通过仅复制returnTable
中的列,然后循环inputTable
并仅添加有效行来创建inputTable
。
另外,请看一下这个if
声明:
if ( ! isNullOrBlank(value_string) ) {
if ( ! isNumeric(value_string) ) {
rows_to_remove.append(r);
}
}
else {
rows_to_remove.append(r);
}
这将在一种情况下保持一行:如果值不是null
或空白且是否为数字。您可以使用单个if
语句重写此逻辑:
if (!isNullOrBlank(rowValue) && isNumeric(rowValue)){
总而言之,它看起来像这样:
Table removeEmptyRows(Table inputTable, String columnName){
Table returnTable = cloneTable(inputTable);
returnTable.clearRows();
for (int row = 0; row < inputTable.getRowCount(); row++){
String rowValue = inputTable.getString(row, columnName);
if (!isNullOrBlank(rowValue) && isNumeric(rowValue)){
returnTable.addRow(inputTable.getRow(row));
}
}
return returnTable;
}
但请注意,此代码不一定更好代码。它没有更快。如果您了解您的代码,那么这是最重要的事情。如果它有效,不要过于担心它会变得更加优雅&#34;。继续下一步。