自定义包装类的打印方法

时间:2018-04-18 14:24:46

标签: java collections

我有一小段代码可以像[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);
    }

5 个答案:

答案 0 :(得分:0)

好吧,你可以用

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

答案 1 :(得分:0)

你做不到。但你可以解析它toString并修改它。

例如

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, "{", "@", "}"));

当然你可以删除所有参数并将其作为defualt:

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

答案 2 :(得分:0)

Java 8构建功能性解决方案。

您可以构建一个执行stream的{​​{1}},然后使用toString加入所有人。{/ p>

collect

答案 3 :(得分:0)

System.out.println(mySet); mySet.toString()将调用AbstractCollection,将使用的实现是[1, 6, 9, 8, 2, 3, "bar", "foo"],其中包含HashSet

如果你打算用不同的方式打印它,但仍然使用StringBuilder实现,你可以:

  1. 只使用private static <T> String print(Set<T> set) { return "{" + set.stream().map(Object::toString).collect(Collectors.joining("@")) + "}"; }

    StringBuilder
  2. 使用@迭代并插入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(); }

    if (is_nan($percentageChange) || is_infinite($percentageChange)) {
        $percentageCHange = 0;
    } else {
        $percentageCHange;
    } 
    

答案 4 :(得分:-1)

的System.out.println(MYSET); 方法println()基本上使用toString()用于除了一些异常之外的任何对象,所以当我们在这个方法中传递对象的集合类型时,它调用相关集合的toString()方法,就像在你的情况下它是HashSet一样.java但这个类有toString()继承AbstractCollection.java的方法,如果我们检查它看起来像这样的方法:

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

所以你必须根据你的要求覆盖这个方法。