(Java)如何将列表中的对象作为字符串或字符串数​​组返回?

时间:2015-03-09 21:05:11

标签: java arrays string list tostring

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

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

所以我有两个班:波萨达和卡米诺。 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 - &gt; destinationCamino1),(originCamino2 - costCamino2 - &gt; destinationCamino2),(..),(originCaminoN-- costCaminoN - &gt; 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(),但是我得到了相同的结果。希望你能帮助我。提前谢谢!

5 个答案:

答案 0 :(得分:1)

listCaminos.toArray()必须返回Camino的数组。您无法通过String[]

Camino.getStringToReturn()的第一行更改为

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

现在应该可以正常工作。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

使用Java 8执行此操作的更简单方法:

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

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

答案 3 :(得分:0)

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

这样的事情:

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

你可以在最后剥去额外的“,”。

答案 4 :(得分:-1)

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

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

您可以使用逗号作为示例,而不是使用\ n(作为新行)。 更重要的是,如果需要改进性能,可以使用StringBuilder进行改进。