自定义包装类的打印方法



我有一小段代码,它给了我[1,2,3],但是我们可以将其修改为{1@2@3}或任何其他格式吗?

public static void main(String[] args) {
        Set<Integer> mySet  = new HashSet<Integer>();
        Integer i1=1;
        Integer i2=2;
        Integer i3=3;
        mySet.add(i1); 
        mySet.add(i2);
        mySet.add(i3);
        System.out.println(mySet);
    }

好吧,你可以使用

System.out.printf("{%s}n", mySet.stream().collect(Collectors.joining("@")));

以获得您想要的结果。

要为创建的Set保留此格式,您可以使用它来覆盖人们正在谈论toString()

public static void main(String[] args) {
    Set<Integer> mySet  = new HashSet<Integer>() {
        public String toString() {
            return String.format("{%s}", stream().collect(Collectors.joining("@")));
        }
    }
    Integer i1=1;
    Integer i2=2;
    Integer i3=3;
    mySet.add(i1); 
    mySet.add(i2);
    mySet.add(i3);
    System.out.println(mySet);
}
你不能

。但是你可以把它解析为字符串并修改它。

例如。

public static<T> String modifier(Set<T> input, String begin, String separator, String end) {
    return input.toString()
                .replace("[", begin)
                .replace(", ", separator)
                .replace("]", end);
   }

然后打电话:

System.out.println(modifier(mySet, "{", "@", "}"));

当然,您可以删除所有参数并将其设为 defuald:

    public static<T> String modifier(Set<T> input) {
    return input.toString()
                .replace("[", "{")
                .replace(", ", "@")
                .replace("]", "}");
    }

Java 8构建功能解决方案。

您可以构建一个执行toStringstream,然后使用 collect 将所有连接在一起。

"[" + mySet.stream().map(i -> Integer.valueOf(i)).collect(Collectors.joining(",")) + "]"

System.out.println(mySet); 将调用 mySet.toString() 并且将使用的实现是 AbstractCollection 中的一个,它给出了类似 [1, 6, 9, 8, 2, 3, "bar", "foo"]


如果您以不同的方式打印它,但保留HashSet实现,您可以:

  1. 使用简单StringBuilder

    private static <T> String print(Set<T> set) {
     return "{" + set.stream().map(Object::toString).collect(Collectors.joining("@")) + "}";
    }
    
  2. 使用StringBuilder循环访问和插入@

    private static <T> String print(Set<T> set) {
        StringBuilder sb = new StringBuilder("{");
        if (set.isEmpty())
            return sb.append("}").toString();
        for (T element : set) {
            sb.append(element.toString()).append("@");
        }
        sb.replace(sb.lastIndexOf("@"), sb.lastIndexOf("@") + 1, "");
        return sb.append("}").toString();
    }
    

System.out.println(mySet(;方法println((基本上是使用toString((处理除某些异常之外的任何对象,因此当我们在此方法中传递对象的集合类型时,它会调用该相关集合的toString((方法,就像在您的情况下它是HashSet一样.java但是此类必须继承AbstractCollection.java的String((方法,如果我们检查该方法,它看起来像:

 public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }

因此,您必须根据需要覆盖此方法。

最新更新