【问题标题】:Remove null values from an ArrayList从 ArrayList 中删除空值
【发布时间】:2021-02-23 14:06:29
【问题描述】:

我有一个按列排列的 ArrayList,每一列在我的数据库中都是一个不同的查询,当显示第一列“ITEMS”时它显示完美,但是当显示第二列“MATERIAL”时,它看起来像烦人的 null,它在下面显示正确的信息,会发生什么?我已经尝试了所有方法,但没有任何效果。

他尝试了 List.remove、List.RemoveIF,没有任何效果

private String[][] obtenerMatriz() {
    DetalleEntradaControlador detalleEntradaCon = new DetalleEntradaControlador();
    ArrayList<DetalleEntrada> lista = detalleEntradaCon.traerDesdeSAP();

    String matrizInfo[][] = new String[lista.size()][8];
    lista.removeAll(Collections.singleton(null));
    for (int i = 0; i < lista.size(); i++) {

        matrizInfo[i][0] = lista.get(i).getItem() + "";
        matrizInfo[i][1] = lista.get(i).getMaterial() + "";
        matrizInfo[i][2] = lista.get(i).getDescrip() + "";
        matrizInfo[i][3] = lista.get(i).getEdadPersona() + "";
        matrizInfo[i][4] = lista.get(i).getTelefonoPersona() + "";
    }
    return matrizInfo;
}

编辑:

在我的方法 traerDesdeSAP 中,我有这个 Query 和 .add to list....

public ArrayList<DetalleEntrada> traerDesdeSAP() {
    ArrayList<DetalleEntrada> lista = new ArrayList<DetalleEntrada>();
    DetalleEntrada detalle = null;

    try {
        Class.forName("com.sap.dbtech.jdbc.DriverSapDB");
        Conn = java.sql.DriverManager.getConnection(sapsource.getSAPSOURCE());
        s = Conn.createStatement();

        //TRAER ITEMS POR NUMERO DE DOC
        rs = s.executeQuery("...");
        while (rs.next()) {
            detalle = new DetalleEntrada();
            detalle.setItem(rs.getString(1));
            lista.add(detalle);
        }

【问题讨论】:

    标签: java list arraylist


    【解决方案1】:

    您可以使用 java8 功能进行过滤和收集:

    List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null);
    List<Integer> listWithoutNulls = list.parallelStream()
      .filter(Objects::nonNull)
      .collect(Collectors.toList());
    

    在你的情况下 List&lt;DetalleEntrada&gt; 因为 ArrayList 正在实现一个 List...

    List<DetalleEntrada> lista = detalleEntradaCon.traerDesdeSAP();
    listaSinNulos = lista.parallelStream()
      .filter(Objects::nonNull)
      .collect(Collectors.toList());
    
    for (int i = 0; i < lista.size(); i++) {
    

    【讨论】:

    • 这与更短的lista.removeAll(Arrays.asList(null)); 做同样的事情,OP 已经在做这件事,并且什么也没做,因为问题不在于这个列表中有null 参考;是这个列表中有DetallaEntrada 实例包含空字段,那是因为traerDesdeSAP 被破坏了。
    • 列表 列表 = detalleEntradaCon.traerDesdeSAP(); List listaSinNulos = lists.parallelStream() .filter(Objects::nonNull) .collect(Collectors.toList());字符串矩阵信息[][]=新字符串[listaSinNulos.size()][8]; for (int i = 0; i
    【解决方案2】:

    错误不在您粘贴的代码中。

    错误在detalleEntradaCon.traerDesdeSAP(); 方法中。

    它应该返回与此代码将返回的等效内容:

    var list = new ArrayList<DetalleEntrada>();
    list.add(new DetalleEntrade("0001", "TR00004016", "TUB RANURADA 795111"));
    list.add(new DetalleEntrade("0002", "TR00004018", "TUB RANURADA 795112"));
    

    相反,它正在返回:

    var list = new ArrayList<DetalleEntrada>();
    list.add(new DetalleEntrade("0001", null, null));
    list.add(new DetalleEntrade("0002", null, null));
    list.add(new DetalleEntrade(null, "TR00004016", null));
    list.add(new DetalleEntrade(null, "TR00004018", null));
    list.add(new DetalleEntrade(null, null, "TUB RANURADA 795111"));
    list.add(new DetalleEntrade(null, null, "TUB RANURADA 795112"));
    

    你有两个选择:

    1. 修复你的错误。这显然是更好的解决方案;如果您无法弄清楚如何执行此操作,则必须提出一个新的 SO 问题,并包含该方法的代码(而不是这个;您粘贴的内容没有任何问题)。

    2. 解决该错误,但这显然是一个非常糟糕的解决方案,并且与大多数错误解决方法一样,这很困难。但是,如果您无法控制损坏的 traerDesdeSAP 方法,这是唯一的方法。正确的解决方案是首先专注于自己修复错误,然后才能继续处理。不要将您的业务逻辑与您未搞砸的代码编织在一起!所以,先写一个单独的方法来折叠列表,然后正常继续(因为你的代码其他方面都很好,只是traerDesdeSAP方法坏了)。

    类似:

    public List<DetalleEntrada> fixBugInTraerDesdeSAP(List<DetalleEntrada> input) {
      int NUMBER_OF_FIELDS = 5;
      int size = list.size() / NUMBER_OF_FIELDS;
      var fixed = new ArrayList<DetalleEntrada>();
      for (int i = 0; i < size; i++) {
        fixed.add(new DetalleEntrada(
          input.get(NUMBER_OF_FIELDS * 0 + i).getItem(),
          input.get(NUMBER_OF_FIELDS * 1 + i).getMaterial(),
          input.get(NUMBER_OF_FIELDS * 2 + i).getDescrip(),
          input.get(NUMBER_OF_FIELDS * 3 + i).getEdadPersona(),
          input.get(NUMBER_OF_FIELDS * 4 + i).getTelefonoPersona()));
      }
      return fixed;
    }
    

    不过,正如我所说,不要这样做 - 转到 traerDesdeSAP 方法并在那里修复它。

    【讨论】:

    • 你可以在编辑中看到我的方法 traerDesdeSAP 我有 .add 到我的 ArrayList!
    • 是的,该代码已损坏。开始一个新问题 - StackOverflow 的设计不是为了让您在单个 SO 条目中提出大量不相关的问题,也不是为了让您将问题从一件事完全改变为完全不同的问题。
    【解决方案3】:

    你考虑过这样的事情吗?

    List<String> list = new ArrayList<>();
    list.add("A");
    list.add(null);
    list.add(null);
    list.add("AB");
    list.add("AC");
    list.add(null);
    list.add(null);
    list.add(null);
    list.add("AD");
    list.add(null);
    list.add("AE");
            
    list.removeIf(o->o == null);
    System.out.println(list);   
    

    打印

    [A, AB, AC, AD, AE]
    

    请注意,条件可以是任何计算结果为布尔值的表达式。因此,您可以检查给定对象的任何和所有字段。

    【讨论】:

      【解决方案4】:

      你可以使用:

      if(value == null) {
          return "";
      }
      return value;
      

      在 DetlleEntrada 对象的 getter 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多