List of int array in Java

Viewed 252

How do I print the contents of a List that contains a primitive type int object in it? Prefer answers to print this in one line. This is the code I have.

public static void main(String[] args) {
    List<int[]> outputList = new ArrayList<>();
    int[] result = new int[] { 0, 1 };
    int[] result2 = new int[] { 2, 3 };
    outputList.add(result);
    outputList.add(result2);

    System.out.println(Arrays.toString(outputList.get(0)));
}

This will give me [0,1] but I am looking for {[0,1],[2,3]}

3 Answers

You can do it by using StringBuffer class

public static void main(String[] args) {
    List<int[]> outputList = new ArrayList<>();
    int[] result = new int[]{0, 1};
    int[] result2 = new int[]{2, 3};
    outputList.add(result);
    outputList.add(result2);
    StringBuffer output=new StringBuffer();
    for (int[] ints : outputList)  output.append(Arrays.toString(ints)).append(",");
    output.insert(0,"{");
    output.replace(output.capacity()-2,output.capacity()-1,"}");
    System.out.println(output);
 }

Output:

{[0, 1],[2, 3]}

The following one-liner can meet your requirement:

System.out.println(
                Arrays.deepToString(outputList.toArray()).replaceAll("(?<=^)\\[", "{").replaceAll("\\](?=$)", "}"));

It uses the positive lookbehind and positive lookahead regex assertions. Note that ^ is used for the start of the text and $ is used for the end of the text. The Arrays.deepToString(outputList.toArray()) gives us the string, [[0, 1], [2, 3]] and this solution replaces [ at the start of this string and ] at the end of this string, with { and } respectively.

In case, you want to remove all whitespace as well, you can chain one more replacement as follows:

System.out.println(Arrays.deepToString(outputList.toArray()).replaceAll("(?<=^)\\[", "{")
            .replaceAll("\\](?=$)", "}").replace(" ", ""));

Demo:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String args[]) {
        List<int[]> outputList = new ArrayList<>();
        int[] result = new int[] { 0, 1 };
        int[] result2 = new int[] { 2, 3 };
        outputList.add(result);
        outputList.add(result2);

        System.out.println(
                Arrays.deepToString(outputList.toArray()).replaceAll("(?<=^)\\[", "{").replaceAll("\\](?=$)", "}"));

        System.out.println(Arrays.deepToString(outputList.toArray()).replaceAll("(?<=^)\\[", "{")
                .replaceAll("\\](?=$)", "}").replace(" ", ""));
    }
}

Output:

{[0, 1], [2, 3]}
{[0,1],[2,3]}

ONLINE DEMO

Solution

This one-liner should do it:

 System.out.println(list.stream().map(Arrays::toString)
                                 .collect(Collectors.joining(", ", "{", "}")));

(I have line-wrapped it for readability.)


Non-solutions

  1. Since you want the outer list to be enclosed in { ... } we can't use List::toString in the Stream solution above. Likewise, Arrays::deepToString is going to give us the wrong output.

    Obviously, this can be fixed using String::replace, but that strikes me as ugly. It is better to use the correct "enclosers" in the first place. (Or change the requirements!!)

  2. Calling Arrays::toString() on an int[][] produced using List::toArray will give you this:

     [[I@2a40cd94, [I@f4168b8]
    

    ... which is not even close to correct.

    Arrays::toString calls toString on the int[] objects, and array classes do not override the Object::toString implementation.

    Arrays::deepToString addresses that aspect of the problem.

Related