P5:删除包含Null / NaN的TableRows

时间:2016-11-01 11:18:51

标签: java processing

目的是从指定列返回一个干净的表,该表只包含其中包含数字数据的行。 下面的代码适合我。但我不禁觉得有更好的方法可以做到这一点。有关更优雅的解决方案的任何想法?

我有代码:

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(""));
}

1 个答案:

答案 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;。继续下一步。