简体   繁体   中英

Java printing a string containing multiple integers

Just starting learning java today and can't seem to figure this out. I am following the tutorial on learnjavaonline.org which teaches you a few things and then asks you to write a code to do a specific thing, it then checks the output to see if its correct. The thing is, if its not correct, it doesn't say why, or give you an example of the correct code.

It wants me to output a string saying "H3110 w0r1d 2.0 true" using all of the primitives

i came up with this

public class Main {
public static void main(String[] args) {
    char h = 'H';
    byte three = 3;
    short one = 1;
    boolean t = true;
    double ten = 10;
    float two = (float) 2.0;
    long won = 1;
    int zero = 0;

    String output = h + three + one + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t;
    System.out.println(output);
}

}

but it outputs 86.0 w0r1d 2.0 true

how can i make it so it doesn't add all the integers, but displays them consecutively?

The problem with this line:

String output = h + three + one + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t;

is that operations are performed left to right, so it first sums h + three (which evaluates to an int ) and then one and then ten . Up to that point you have a numerical value (an int ) that then will be "summed" to a String . Try something like this:

String output = "" + h + three + one + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t;

In this second case your expression will start with a String object, evaluating the rest of the operations as String s.

You of course could use "" at the beginning or any other value that evaluates to String , like String.valueOf(h) . In this last case you wouldn't need to use String.valueOf() for the other operands, as the first one is already a String.

An easy and ugly way to do this would be to use String.valueOf for each numerical value.

As in:

String output = h + String.valueOf(three); // + etc...

Edit

morgano 's approach is perfectly valid as well - +1 for that.

On a more general topic, you might want to use String.concat for String concatenation, or even better, a StringBuilder object.

This SO page contains a lot of info you can use on the matter.

You can either convert your numbers into a string using the toString or valueOf methods of the wrapper classes (guess you are not there yet), or just stuff all your primitives into the printline without the String output .

system.out.println(h + three + one + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t);

All you need to look for is that there is a String in the printline statement. Meaning if you only want to print our number based datatype you can use system.out.println("" + youNumberVariable) .

There would also be the option to add an empty string at the beginning of your declaration of output output = "" + theRest; to force all following values into the string like it does in the printline statement.

Most of it is not very pretty coding but will completly suffice for the learning process.

I would use String.valueOf to explicitly cast each numeric value to String before being added. Like so:

String output = h + String.valueOf( three ) + String.valueOf( one ) + String.valueOf( ten ) + " " + "w" + String.valueOf( zero ) + "r" + String.valueOf( won ) + "d " + String.valueOf( two ) + " " + t;

The trick is to get the compiler to interpret + as string concatenation (which then silently convert the numbers to strings) instead of adding two numbers. This mean that one of the two arguments to + must be a string, and not - as your first three arguments - numbers (and yes, a char is a number).

It is not typical in code in the wild to want numbers to be directly adjacent to each other, but have a space between them, like:

String output = h + " " + three + " " + one + " " + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t;

If you really want to have no spaces, then just let the first argument be the empty string:

String output = "" + h ....

You could also just change h from char to String.

The result you're getting is because, essentially, you're doing arithmetical operations on numeric variable before printing them when relying on implicit casting.

Even the Char is a numeral! H has the value 72 in the ascii table, so you are basically instructing the Java program to print the result of: 72 + 3 + 1 + 10.0 (which is equal to 86.0)

String concatenation with mixed inputs of numerals and symbols like this can be problematic since implicit casting is in play. In order to make sure stuff is as you want, without using explicit casting, maybe use either strings between each numeric value, like this:

    char h = 'H';  // This is a numeral! Capital H has value 72 in Ascii table
    byte three = 3;
    short one = 1;
    boolean t = true; // not a numeral
    double ten = 10;
    float two = (float) 2.0;
    long lOne = 1;
    int zero = 0;

    System.out.println(h + "" + three + "" + one + "" + (int) ten + " w"  
        + zero + "r" + lOne + "d " + two + " " + t );

Note how I needed to cast ten to the int-type, to lose the decimal...

Above example is however not a good example of using string concatenations! For a proper solution, and this is maybe more aimed at people with more experience, is to try using String formatting, like this:

System.out.println(String.format("%s%s%s%s w%sr%sd %s %s", h, three, one,
    (int) ten, zero, lOne, two, t));

Another way is to use message formatting like this, maybe not the best choice for this assignment since the float will be printed as an integer. Also needs to import java.text.MessageFormat

// please note: the double and the float won't print decimals!
// note: import java.text.MessageFormat for this
System.out.println(MessageFormat.format("{0}{1}{2}{3} w{4}r{5}d {6} {7}", h,
    three, one, (int) ten, zero, lOne, two, t));

More examples from the Ascii table.

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

       int b = 3110;
       int d = 0;
       String e = "orld";
       double f = 2;
       boolean g = true;
       System.out.println("H" + b + " " + "w" + d + e + " " + f + " " + g);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM