【问题标题】:How to remove the brackets [ ] from ArrayList#toString()?如何从 ArrayList#toString() 中删除括号 []?
【发布时间】:2015-10-21 11:31:56
【问题描述】:

我在 Java 中创建了一个数组列表,看起来像这样:

 public static ArrayList<Integer> error = new ArrayList<>();

for (int x= 1; x<10; x++)
 { 
    errors.add(x);
 }

当我打印错误时,我得到的错误是

[1,2,3,4,5,6,7,8,9]

现在我想从这个数组列表中删除 brackets([ ])。我以为我可以使用方法errors.remove(“[”),但后来我发现它只是布尔值并显示真或假。有人可以建议我如何实现这一目标吗?

提前感谢您的帮助。

【问题讨论】:

标签: java arraylist


【解决方案1】:

这是Integer 中的ArrayList。此ArrayList 不能包含类似'[' 的字符。但是您可以像这样从中删除Integer -

error.remove(3);

【讨论】:

    【解决方案2】:

    如果您打印错误列表,它将在内部调用列表的toString() 方法,并且此方法会添加括号。有几种可能性。您可以通过toString() 方法获取字符串,然后从字符串中删除括号。或者您编写自己的方法来打印列表。

    public static <T> void printList(List<T> list)
    {
        StringBuilder output = new StringBuilder();
        for(T element : list)
            output.append(element + ", ");
        System.out.println(output);
    }
    

    【讨论】:

    • 我什至会使用 StringBuilder 和 append() 方法,然后通过System.out.print(); 返回一个字符串来加速和优化代码:)
    【解决方案3】:

    简答:System.out.println(errors.toString().substring(1, errors.toString().length() - 1))

    解释:当您调用System.out.println(obj) 并带有Object 作为参数时,打印的文本将是obj.toString() 的结果。 ArrayList.toString() 的实现方式使其在括号 [] 之间以逗号分隔的每个包含项目的串联表示其内容(它们的 .toString() 表示也是如此)。

    依赖另一个类的toString() 实现不是一个好习惯。您应该使用自己的方式来格式化结果。

    【讨论】:

    • 您的子字符串有问题,因为errors.length 没有考虑逗号分隔符。 length 也是一个字段,而不是一个方法。
    • @Dragondraikk 你是对的,有一个 .toString() 丢失:) 已修复
    • 应该是 erros.toString.length() - 1
    • @dotvav :感谢您快速而详细的回复。欣赏它:)
    【解决方案4】:
    String text = errors.toString().replace("[", "").replace("]", "");//remove brackets([) convert it to string
    

    【讨论】:

    • 如果将中间数组作为值,那么它不可能吗?
    【解决方案5】:

    括号不是你的数组列表的一部分,因为你已经提到它是整数类型的

    ArrayList&lt;Integer&gt;

    当您使用

    打印错误时
    System.out.println(errors);
    

    它只是格式化您的数据,只需遍历数组并分别打印每个值

    【讨论】:

      【解决方案6】:

      括号实际上不在列表中,它只是列表的表示。如果任何对象进入 String 输出,则会调用对象的 toString() 方法。在 ArrayList 的情况下,此方法传递由括号包裹的列表的内容。

      如果您想打印不带括号的 ArrayList,只需遍历它并打印它。

      【讨论】:

        【解决方案7】:

        您看到的括号只是在 JAVA 中显示列表的一种自动方式(例如,使用 System.out.println(list); 时。

        如果您不希望它们在显示时显示,您可以创建自定义方法:

        public void showList(List<Integer> listInt)
        {
            for(int el : listInt)
            {
                System.out.print(el + ", ");
            }
        }
        

        然后根据您的喜好调整此代码以显示此内容!

        【讨论】:

          【解决方案8】:

          您的列表中没有括号。 这只是 Java 默认打印列表的方式。

          如果你想打印列表的内容,你可以这样

          for (Integer error : errors) {
              System.out.format("%d ", error);
          }
          

          【讨论】:

            【解决方案9】:

            System.out.println(error.toString().substring(1, error.toString().length()-1)); 这对我有用

            【讨论】:

              【解决方案10】:

              您可能正在调用System.out.println 来打印列表。 JavaDoc 说:

              This method calls at first String.valueOf(x) to get the printed object's string value
              

              括号是由ArrayList 的toString 实现添加的。要删除它们,您必须首先获取字符串:

              String errorDisplay = errors.toString();
              

              然后去掉括号,如下所示:

              errorDisplay = errorDisplay.substring(1, errorDisplay.length() - 1);
              

              依赖toString() 实现并不是一个好习惯。 toString() 仅用于生成人类可读的表示以用于日志记录或调试目的。所以最好在迭代时自己构建字符串:

              List<Integer> errors = new ArrayList<>();
              StringBuilder sb = new StringBuilder();
              for (int x = 1; x<10; x++) { 
                  errors.add(x);
                  sb.append(x).append(",");
              }
              sb.setLength(sb.length() - 1);
              String errorDisplay = sb.toString();
              

              请注意,这不是一个数组,只是一个显示列表内容的字符串。要从列表创建数组,您可以使用 list.toArray():

              // create a new array with the same size as the list
              Integer[] errorsArray = new Integer[errors.size()];
              // fill the array
              errors.toArray(errorsArray );
              

              编辑:从面向对象的角度来看,错误和 errorsDisplay 在概念上属于一个类,例如:

              public class Errors {
              
                  private final List<Integer> codes = new ArrayList<>();
              
                  public void add(int error) {
                      codes.add(error);
                  }
              
                  public Stream<Integer> get() {
                      return codes.stream();
                  }
              
                  @Override
                  public String toString() {
                      return codes.stream()
                          .map(Object::toString)
                          .collect(Collectors.joining(", "));
                  }
              }
              

              【讨论】:

              • 感谢您的回答。我实际上想在一个单独的类中访问这个数组。但我需要它没有方括号,因为数组不能用它们声明。但是谢谢你的详细解释:)
              • 创建数组并将其传递给该类比创建带有逗号的字符串并对其执行 String.split() 更简洁。
              【解决方案11】:

              你可以这样写。

              String output = errors.toString().replaceAll("(^\\[|\\]$)", "");

              【讨论】:

                【解决方案12】:

                为此,您可以使用String.join 方法,如下所示。

                String.join(",",errors);
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-08-03
                  • 1970-01-01
                  • 2018-05-20
                  • 1970-01-01
                  • 2013-11-11
                  • 2020-06-21
                  • 1970-01-01
                  相关资源
                  最近更新 更多