【问题标题】:(Java) How to return objects from a list as a string or array of strings?(Java) 如何将列表中的对象作为字符串或字符串数​​组返回?
【发布时间】:2015-03-09 21:05:11
【问题描述】:

编辑:我已将完整的类文件和测试文件上传到 Dropbox,以备您自己尝试: https://www.dropbox.com/sh/03qsecq3bd55w78/AAA_PT_BczNGl7cTZO_Zf_qUa?dl=0

首先,对不起,如果这是一个非常简单的问题 - 我才刚刚开始使用 java,而且我根本没有很多编程经验。

所以我有两个课程:Posada 和 Camino。 Posada 包含一个 Camino 对象列表。我需要重写 Posada 的 toString 方法,以便它返回一个字符串,其中包含其列表包含的 Camino 对象的所有 toString 方法,如下所示:

波萨达:

public class Posada {

    /*other attributes*/
    private List<Camino> listCaminos;   

    /*Getters*/
    public List<Camino> getLisaCaminos() {
        return listCaminos;
    }

    /*Builder*/
    public Posada(String nombre, int engRecuperada) {
        /*Other attributes*/
        this.listaCaminos = new ArrayList<Camino>();
    }

    /*Methods*/
    public String getStringToReturn(){
        String[] arrayCaminos = listCaminos.toArray(new
        String[listCaminos.size()]);

        String string = "";
        string += /*Some other attributes that go before the Camino objects
        and work fine*/;

        for(int i = 0; i < listCaminos.size(); i++) {
            string += ", " + arrayCaminos[i];
        }

        return string;
    }

    /*toString*/
    @Override
    public String toString() {
        return getStringToReturn(); //failure
    }

}

卡米诺

public class Camino {

    /*Attributes*/
    private Posada origin;
    private Posada destination;
    private int cost;

    private static int costTotal;

    /*Contructor*/
    public Camino(Posada origin, Posada destination, int cost){
        this.origin = origin;
        this.destination = destination;
        this.cost = cost;
        Camino.costTotal = Camino.costTotal + cost;

    }

    /*Getters*/
    public int getCost() {
        return cost;
    }

    public Posada getDestination() {
        return destination;
    }

    public Posada getOrigin() {
        return origin;
    }

    /*Methods. Irrelevant*/


    /*toString*/
    @Override
    public String toString() {
        return "(" + getOrigin() + "--" + getCost() + "-->" +
        getDestination()+ ")";
    }

}

因此,打印 Posada 时的预期结果应该类似于“Other_attributes, (originCamino1--costCamino1-->destinationCamino1), (originCamino2--costCamino2-->destinationCamino2), (..), (originCaminoN--costCaminoN- ->destinationCaminoN)",N 是列表中 Camino 对象的总数。但是,我不断收到以下错误:

Exception in thread "main" java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at java.util.ArrayList.toArray(Unknown Source)
at apartado1.Posada.getStringToReturn(Posada.java:106)
at apartado1.Posada.toString(Posada.java:121)
at java.lang.String.valueOf(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)

我知道它必须是非常容易修复的东西,但我一直在环顾四周,无论我做什么都无法正常工作。我尝试过使用 toString() 和 toArray(),但得到了相同的结果。这里希望你能帮助我。提前致谢!

【问题讨论】:

  • Java 如何将 Camino 的实例存储到字符串数组中?为什么首先将列表转换为数组:您可以直接迭代列表。

标签: java arrays string list tostring


【解决方案1】:

为什么 ArrayList 的默认实现不起作用?这个这个:

@Override
public String toString() {
    return listCaminos.toString();
}

【讨论】:

  • 当我改变它时,我收到以下错误消息: java.util.ArrayList$Itr.(Unknown Source) at java.util.ArrayList$Itr.(Unknown Source) at java.util.ArrayList$Itr. util.ArrayList$Itr.(Unknown Source) at java.util.ArrayList.iterator(Unknown Source) at java.util.AbstractCollection.toString(Unknown Source) at apartado1.Posada.toString(Posada.java:121)在 java.lang.String.valueOf(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at apartado1.Camino.toString(Camino.java:68) at java.lang.String.valueOf(Unknown Source)
  • 还是 StackOverFlow 错误?原因可能是因为您在 Camino toString 方法中调用了 getOrigin()。这会导致 Posada toString 被调用等等..尝试 getOrigin().hashcode() 或 sth 打破循环
【解决方案2】:

listCaminos.toArray() 必须返回Camino 的数组。你不能传入String[]

Camino.getStringToReturn()的第一行改为

Camino[] arrayCaminos = listCaminos.toArray(new Camino[listCaminos.size()]);

现在应该可以正常工作了。

编辑:再次查看您的代码,我不明白您为什么首先使用数组。为什么不遍历列表元素?

【讨论】:

  • 当我改变它时,我收到以下错误消息: Exception in thread "main" java.lang.StackOverflowError at apartado1.Posada.getStringToReturn(Posada.java:106) at apartado1.Posada.toString (Posada.java:120) at java.lang.String.valueOf(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at apartado1.Camino.toString(Camino.java:68) at java.lang.String .valueOf(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at apartado1.Posada.getStringToReturn(Posada.java:111) at apartado1.Posada.toString(Posada.java:120) at java.lang.String .valueOf(未知来源)
  • @AlexQ。看起来Caminoorigindestination 中引用其父Posada,导致无限递归,因为toString 方法相互依赖。你需要重新考虑你的方法。
  • 啊……我明白了!所以这就是它的意思!我将不得不弄清楚如何在不进行无限循环的情况下做到这一点。非常感谢!
【解决方案3】:

使用 Java 8 更简单的方法:

@Override
public String toString() {
    return "Other_attributes, " +
        listCaminos.stream()
            .map(Camino::toString)
            .collect(Collectors.joining(", "));
}

在迭代之前无需将列表转换为数组,并且使用 Java 8 流甚至无需迭代列表来创建 Camino 对象的逗号分隔字符串。

【讨论】:

    【解决方案4】:

    您可以使用 Matthias 建议的内容,或者如果您想要自定义输出,您可以遍历每个元素并连接它们的 toString 输出。

    类似这样的:

    public String toString(){
         StringBuilder builder = new StringBuilder();
         for (Camino camino : listCaminos) {
             builder.append(camino.toString()).append(",");
         }
         return builder.toString();
    }
    

    你可以去掉末尾多余的“,”。

    【讨论】:

    • 当我改变它时,我收到以下错误消息: Exception in thread "main" java.lang.StackOverflowError at apartado1.Camino.toString(Camino.java:68) at apartado1.Posada.toString (Posada.java:123) at java.lang.String.valueOf(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at apartado1.Camino.toString(Camino.java:68) at apartado1.Posada.toString (Posada.java:123) 在 java.lang.String.valueOf(Unknown Source) 在 java.lang.StringBuilder.append(Unknown Source)
    • 那是因为你似乎有一个循环依赖,每个类的toString方法都在调用另一个类的toString方法。请相应地更正代码
    【解决方案5】:

    我宁愿在 toString 中使用 foreach 循环,例如:

    public String toString()
    {
         String ret = "";
         for (Camino camino : listCaminos)
         {
             ret += camino.toString() + "\n";
         }
         return ret;
    }
    

    您可以使用逗号作为示例,而不是使用 \n (作为新行)。 此外,如果需要提高性能,还可以使用 StringBuilder 对其进行改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多