【问题标题】:How to modify a toString method of an ArrayList如何修改 ArrayList 的 toString 方法
【发布时间】:2015-02-26 00:34:52
【问题描述】:

我正在尝试修改 Warehouse 类中的 toString 方法,以便它返回

Bin B0:
Dress Shoe - Loafer (size 10-1/2), SKU 1234-13: 5
Boot - Riding (size 8), SKU 1234-5: 5
Bin B1:
Bin B2:
Dress Shoe - Wing-tip (size 10), SKU 1234-3: 10
Bin B3:
Casual Shoe - Sandal (size 9-1/2), SKU 1234-0: 8
Bin B4:

我的主班

public static void main( String[] args )
{
  Warehouse w = new Warehouse( 10 );
  Footwear d0 = new DressShoe( "Loafer", 10.5, "1234-13" );
  Footwear b = new Boot( "Riding", 8, "1234-5" );
  Footwear c = new CasualShoe( "Sandal", 9.5, "1234-0" );
  Footwear d1 = new DressShoe( "Wing-tip", 10, "1234-3" );
  w.stockWarehouse( d0, 5, "B0" );
  w.stockWarehouse( b, 5, "B0" );
  w.stockWarehouse( c, 8, "B3" );
  w.stockWarehouse( d1, 10, "B2" );
  System.out.println( w.toString() );
}

stockWarehouse 方法是“隐藏的”并且没有给出。 DressShoe、Boot、CasualShoe 和 DressShoe 是鞋类的扩展类。

Footwear 是一个接受 String 样式、double size 和 String SKU 的类。它的 toString 方法返回鞋子信息如:

Dress Shoe - Loafer (size 10-1/2), SKU 1234-13

Bin是一个类,它接受String名称并创建一个ArrayList的内容,它的toString方法返回Bin号和内容如:

[SKU 1234-13: 5, SKU 1234-13: 5]

这是我的仓库类。

public class Warehouse {
    private int myBinMax;
    private ArrayList<Footwear> myCatalog;
    private ArrayList<Bin> myBins;

    public Warehouse (int binMax)
    {
        myBinMax = binMax;
        myCatalog = new ArrayList<Footwear>();
        myBins = new ArrayList<Bin>(5);
        for(int i=0; i<5; i++)
        {
            addBin();
        }
    }

    public void addBin() 
    { 
       myBins.add( new Bin( "B" + myBins.size() ) );
    }

    @override
    public String toString()
    {
      String b0 = myBins.get(0).getName() + "\n" + 
      myCatalog.get(0).toString() + ", " +   myBins.get(0).getContents().get(1) + "\n";

    int b0size = myBins.get(0).getContents().size();

    return b0size + b0;
    }       
}

EDIT 添加了鞋类

public class Footwear

{

private String myStyle;
private double mySize;
private String mySKU; 

public Footwear ( String style, double size, String SKU)

{
    myStyle = style;
    mySize = size;
    mySKU = SKU;
}


 public String getStyle()

 {
     return myStyle;
 }


 public double getSize()

 {
     return mySize;
 }


 public String getSKU()

 {
     return mySKU;
 }


 public String getType()

 {
     return "Unspecified";
 }

 public String printSize()

 {
     int x = (int)(getSize());
     if (getSize() % x == 0.5)
     return getStyle() + " (size " + x + "-1/2)";  

     else
     return getStyle() + " (size " + x + ")";

 }

 public String toString()

 {
      int x = (int)(getSize());
      String ShoeInfo = "";
      if (getSize() % x == 0.5)
      ShoeInfo = getStyle() + " (size " + x + "\u00bd" + ")";
      else
      ShoeInfo= getStyle() + " (size " + x + ")";    

     if (!(getType().equals("Unspecified")))
     return getType() + " - " + ShoeInfo;

     else
     return ShoeInfo;

 }

}

【问题讨论】:

  • 能展示一下Bin类的代码吗?
  • 对于 toString,您可以按照需要的顺序添加所需的位。没有什么魔法可以做到这一点。
  • @Eran,确定我已经添加了 Bin 类。
  • 问题似乎出在您的BinItem's toString()方法和您的仓库的toString()。当您仅使用索引 0 时,我个人无法理解您希望如何显示所有 BINS:int x = 0; binsOut = myBins.get(x).toString(); catOut = myCatalog.get(x).toString();
  • 不清楚 myCatalog 列表和 myBins 列表之间的关系,但如果 Bin 的 toString 没有返回 Warehouse 的 toString 所需的输出,请不要使用它。您可以访问 Bin 实例的属性(使用 getName 和 getContents)并根据需要对其进行格式化。

标签: java arraylist tostring


【解决方案1】:

这是您的解决方案 新的仓库 toString 方法

@Override
    public String toString()
    {
      String output = "";
      for(Bin b : myBins)
      {
          System.out.print(b.toString());
          if(!b.getContents().isEmpty())
          {
            for(BinItem bi : b.getContents())
            {
                System.out.println(findSKU(bi.getSKU()) + ", " + bi.toString());
            }
          }
      }
      return " ";
    }   
    private String findSKU(String SKU)
    {
        for(Footwear f : myCatalog)
        {
            if(SKU.equals(f.getSKU()))
                return f.toString();
        }
        return "";
    }

新的 Bin toString 方法

@Override
public String toString()
{
    String s = "Bin " + myName + ":\n";
    return s;    
}        

要完成此操作,您需要向鞋类类添加另一个名为 String shoeType 的变量,并让鞋类的子类将其设置为相应的类型 IE Dress Shoe、Casual Shoe

新鞋类 toString 方法

@Override
    public String toString()
    {
        int x = (int)(getSize());
        String ShoeInfo = "";
        if (getSize() % x == 0.5)
            ShoeInfo = shoeType + " - " + myStyle + " (size " + x + "\u00bd" + ")";
        else
            ShoeInfo= shoeType + " - " + myStyle + " (size " + x + ")";    
         if (!(getType().equals("Unspecified")))
            return getType() + " - " + ShoeInfo;
         else
            return ShoeInfo;
    }

具有上述更改的示例输出。

Bin B0:
Dress Shoe - Loafer (size 10½), SKU 1234-13: 5
Boot - Riding (size 8), SKU 1234-5: 5
Bin B1:
Bin B2:
Dress Shoe - Wing-tip (size 10), SKU 1234-3: 10
Bin B3:
Casual Shoe - Sandal (size 9½), SKU 1234-0: 8
Bin B4:
Bin B5:
Bin B6:
Bin B7:
Bin B8:
Bin B9:

【讨论】:

  • 我在底部添加了鞋类。我试过这个并给了我一个错误“java.lang.IndexOutOfBoundsException:索引:4,大小:4”
  • 您的 bin 数组列表较小。但是您的鞋类可能是导致问题的原因。这是一个有趣的难题。
  • 这太好了,非常感谢!我已经在这个小项目上工作了好几天,实际上我今天放弃了......刚刚检查并看到你已经更新了它!我想补充的一件事是我不能覆盖我的 Bin 和 Footwear 方法,只能编辑 Warehouse 类。我将 bin 名称打印输出修改为 System.out.print(b.getName()+ ":" + "\n"); 再次,非常感谢!!
【解决方案2】:

我会在您的 Warehouse 类中使用 StringBuilder 类来解决这个问题。此类允许进行字符串操作,例如追加、插入和删除。

这是应该让您走上正轨的伪代码

StringBuilder output = new StringBuilder();
output.append(myBins.get(x).toString());
ouput.replace(0, output.length, "/n");
int colon = output.charAt(':');
output.insert(colon, "/n");
output.insert(colon +1, catOut);

你可能需要调整一下,但这应该会给你这个想法

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2013-08-10
    • 1970-01-01
    • 2023-03-22
    • 2017-08-07
    • 2015-11-01
    相关资源
    最近更新 更多