【问题标题】:Java, need help printing a string out of an arrayJava,需要帮助从数组中打印字符串
【发布时间】:2015-01-11 15:20:47
【问题描述】:

当我尝试在第一个开关中打印出“Prim 对象”作为案例 1 时,我得到一个如下所示的打印错误:

Exception in thread "main" java.util.IllegalFormatConversionException: d != java.lang.String
            at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4302)
            at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2793)
            at java.util.Formatter$FormatSpecifier.print(Formatter.java:2747)
            at java.util.Formatter.format(Formatter.java:2520)
            at java.util.Formatter.format(Formatter.java:2455)
            at java.lang.String.format(String.java:2927)
            at dn09$Tip.toString(dn09.java:82)
            at java.lang.String.valueOf(String.java:2981)
            at java.io.PrintStream.println(PrintStream.java:821)
            at dn09.izpisi(dn09.java:32)
            at dn09.main(dn09.java:19)

我无法弄清楚出了什么问题,我想做的是将tipi数组的i槽中的Tip打印为字符串。我阅读和创建“Prim”的方式可能是错误的吗?或者是否有任何用于打印的方法错误?如果我使用类 Tip 中的 toString 方法,它也不会打印

这是我现在拥有的整个程序:

    import java.util.*;
    public class dn09 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int B = sc.nextInt();
        Tip[] tipi = preberi(sc);
        int u = sc.nextInt();
        int[] ukazia = new int[u];
        int[] ukazid = new int[u];
        for (int i = 0; i < u; i++) {
            ukazia[i] = sc.nextInt();
            ukazid[i] = sc.nextInt();
        }
        for (int i = 0; i < u; i++) {
            switch(ukazia[i]) {
                case 1:
                    int vrstica = ukazid[i];
                    izpisi(vrstica-1, tipi);
                case 2:

                case 3:

            }

        }


    }

    private static void izpisi(int i, Tip[] tipi) {
        System.out.println(tipi[i]);
    }


    private static Tip[] preberi(Scanner sc) {
        int d = sc.nextInt();
        Tip[] tipi = new Tip[d];
        for (int i = 0; i < d; i++) {
            String tipPodatka = sc.next();
                switch (tipPodatka) {
                    case "prim":
                        tipi[i] = new Prim(sc.nextInt());
                        break;
                    case "arr":

                        break;
                    case "ostruct":
                        break;
                    case "pstruct":
                        break;
                }
        }
        return tipi;
    }




    private static class Prim extends Tip {
        protected int v;

        public Prim (int v) {
            this.v = v;
        }

        public String vrsta() {
            return "prim";
        }

        public String podatki() {
            return String.format("v = %d", this.v);
        }


    }

    private static abstract class Tip extends dn09 {
        public abstract String podatki();
        public abstract String vrsta();
        public String toString() {
            return String.format("%s%d", this.vrsta(), this.podatki());
        }
    }
}

【问题讨论】:

  • podatki() 返回 String,因此要么将 %s%d 更改为 %s%s,要么将其返回类型更改为类似 int 的数字。

标签: java arrays string printing


【解决方案1】:

将您的代码更改为:

return String.format("%s%s", this.vrsta(), this.podatki());

(两次%s,不是%s,然后是%d

%d表示要打印一个数字,但this.podatki()返回的是String,与%d不兼容。

【讨论】:

  • 你知道我将如何将 int v 和 int B 添加到 izipisi 方法中,这样它就会像这样打印它:tipi[i](next line) v(next line) B (下一行)对不起,我对编程很陌生,所以我遇到了麻烦
  • 您需要将B 作为参数传入izipsi 方法,因为现在B 只存在于main 方法的范围内。而v 只存在于Prim 类中,但izipsi 接收到超类类型Tip,这意味着您需要转换:(Prim)tipi[i].v - 这不好,当Tip[i] 不存在时会失败普里姆。否则,如果您在 izipsi 中有 Bv,那么您可以打印 System.out.format("%s\n%d\n%d\n", tipi[i], B, v);
  • 我该如何让 v 进入 main 方法?我似乎无法理解我编写了一个返回 v 的方法,然后将其调用到 main 但它说它找不到符号
【解决方案2】:

return String.format("%s%d", this.vrsta(), this.podatki());

如果我没看错的话,podatki 是一个字符串,而不是一个整数。所以你需要稍微改变一下格式:

return String.format("%s%s", this.vrsta(), this.podatki());
                         ^

【讨论】:

    【解决方案3】:

    使用 String.format 时,%d 用于整数。要插入一个字符串,你必须使用%s

    private static abstract class Tip
    {
        public abstract String podatki();
        public abstract String vrsta();
    
        public String toString()
        {
            return String.format("%s%s", this.vrsta(), this.podatki());
        }
    }
    

    【讨论】:

    • 顺便说一句,在这里询问答案时,您应该确保遵循命名约定,而不是使用神秘语言来命名您的字段、方法和类。
    • 如果我用 Google 搜索“vrsta”,我会得到波斯尼亚语结果,如果我搜索“podatki”,我会得到波兰语结果。不知道 OP 来自哪里,但我猜来自东欧国家。仅仅因为一个词不是英语,并不意味着它是神秘的。
    • 表示对象的种类(比如球或三角形)和对象上的数据