import java.util.Arrays;
import java.util.stream.Collectors;

class Main
{
    public static void main( String[] args )
    {
        runTests();
    }

    public static void runTests()
    {
        //# Input from original post
        assertEquals( largestNumber( new int[]{ 3, 30, 34, 5, 9 } ), "9534330" );
        //# Other tests from other comments
        assertEquals( largestNumber( new int[]{ 30, 301 } ), "30301" );
        assertEquals( largestNumber( new int[]{ 3, 30, 34, 90, 9 } ), "99034330" );
        //# Invalid assertion
        assertEquals( largestNumber( new int[]{ 1, 2, 3 } ), "123" );
    }

    public static String largestNumber( int[] array )
    {
        String result = Arrays
            .stream( array )
            .mapToObj( String::valueOf )
            .sorted( Main::sort )
            .collect( Collectors.joining() );
        System.out.println( result );
        return result;
    }

    public static int sort( String a, String b )
    {
        String t1 = a + b;
        String t2 = b + a;
        return Integer.compare( 0, Integer.valueOf( t1 ).compareTo( Integer.parseInt( t2 ) ) );
    }

    private static void assertEquals( String actual, String expected )
    {
        if ( !actual.equals( expected ) )
        {
            System.out.println( "ERROR: Expected " + expected + " but found " + actual );
        }
    }

}