列表以Int作为第一个参数,String作为第二个参数(Java)

时间:2014-01-28 03:13:17

标签: java indexing arguments

我试图编写一个方法,它返回一个int索引作为第一个参数,一个字符串作为第二个参数。该方法应该按索引的顺序将字符串插入到列表中。如果Int为负数或留下间隙,则应抛出IllegalArgumentException。这就是我所做的:

public MitchList() {
    data = new String[2];
    size = 0;
}
public int size() {
    return size;
}
    public void add(int index, String s){
    if (data.length == size) {
        String[] newArray = new String[data.length*2];
        for (int i=0; i < data.length; i++) {
            newArray[i] = data[i];
        }
        data = newArray;
}
    if (index > 0 || index <size){
    throw new IllegalArgumentException();   
    }

    if (data[index] != ""){
        for (int i = 0; i <size; i++){ 
        s = data[index];
        }
    }
    data[index] = s;
    size++;

}

JUnit测试说它失败了。它应返回如下列表:

1,猫 2,狗 3,松鼠

所以......

关于解决方案的任何想法?

更新

这就是我现在所拥有的。

/**
  <P>{@code java MitchList}</P>
**/
  public class MitchList  {
  private String[] asData;
  private int iSize;
  public static final void main(String[] igno_red)  {
     MitchList ml = new MitchList();
     test(ml, 0, "hello");
     test(ml, 1, "goodbye");
  }
  public static final void test(MitchList m_l, int i_ndex, String s_tring)  {
     m_l.add(i_ndex, s_tring);

     System.out.print(s_tring + ", ");
  }
  public MitchList() {
      asData = new String[2];
      iSize = 2;
  }
  public int iSize() {
      return iSize;
  }

      public void add(int index, String s){
  System.out.println("asData.length=" + asData.length + ", iSize=" + iSize + "");
      if (asData.length == iSize) {
  System.out.println("1");
          String[] newArray = new String[asData.length*2];
          for (int i=0; i < asData.length; i++) {
              newArray[i] = asData[i];
          }
          asData = newArray;
  }
      if (index > 0 || index <iSize){
  System.out.println("2");
 throw new IllegalArgumentException("index (" + index + ") must be greater than zero    and less than size (" + iSize + ")"); 

       }
  System.out.println("asData[" + index + "]=" + asData[index] + "");

      if (asData[index] != ""){
  System.out.println("3");
          for (int i = 0; i <iSize; i++){
  System.out.println("i=" + i + ", setting s to ");
             s = asData[index];
          }
      }
      asData[index] = s;
      iSize++;
  }

我拿了你的代码并改了一下。现在它只是回馈

  asData.length=2, iSize=2

1 2

Exception in thread "main" java.lang.IllegalArgumentException: index (0) must be greaterthan zero and less than size (2)
at MitchList.add(MitchList.java:42)
at MitchList.test(MitchList.java:14)
at MitchList.main(MitchList.java:10)

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

很难弄清楚你在做什么,只要你在这里给我们的信息很少,但这是我到目前为止所想到的。下面是您的代码,其中包含一些调试语句。

我强烈建议您在无消息异常中添加一些信息。也就是说,改变

throw new IllegalArgumentException();

throw new IllegalArgumentException("index (" + index + ") must be greater than zero and less than size (" + iSize + ")");

当我运行此代码时,这是输出

[R:\jeffy\programming\sandbox\xbnjava]java MitchList
asData.length=2, iSize=0
asData[0]=null
3
hello,
asData.length=2, iSize=1
2
Exception in thread "main" java.lang.IllegalArgumentException: index (1) must be greater than zero and less than
 size (1)
        at MitchList.add(MitchList.java:41)
        at MitchList.test(MitchList.java:14)
    at MitchList.main(MitchList.java:11)

您隐藏了一些非常有价值的信息:大于零且不到一个是不可能的

另外

  • 您使用data.length*2将数组的大小增加了一倍,但是您只将size增加了一个:size++;
  • 您使用数组中的每个值覆盖s的值(for循环中的s = data[index];),使其始终等于最后一个元素。然后你只是重新插入最后一个元素的当前值。换句话说,s参数被忽略,数组永远不会改变。
  • 还有一个想法:我认为if(data[index] == "")应该是if(data[index] == null)。字符串数组初始化为null,而不是空字符串。

考虑使用以下代码及其所有调试语句作为解决上述问题的起点,并发现可能存在的其他问题。祝你好运!

   import org.apache.commons.lang.StringUtils;
   /**
      <P>{@code java MitchList}</P>
    **/
   public class MitchList  {
      private String[] asData;
      private int iSize;
      public static final void main(String[] igno_red)  {
         MitchList ml = new MitchList();
         test(ml, 0, "hello");
         test(ml, 1, "goodbye");
      }
      public static final void test(MitchList m_l, int i_ndex, String s_tring)  {
         m_l.add(i_ndex, s_tring);

         //Print the array at the last index in asData
         System.out.println(StringUtils.join(m_l.asData, ", "));

        //If you don't have `commons.lang` installed, use this:
        //
        //   for(String s : asData)  {
        //      System.out.print(s + ", ");
        //   }
      }
      public MitchList() {
          asData = new String[2];
          iSize = 0;
      }

      public int iSize() {
          return iSize;
      }


          public void add(int index, String s){
System.out.println("asData.length=" + asData.length + ", iSize=" + iSize + "");
          if (asData.length == iSize) {
System.out.println("1");
              String[] newArray = new String[asData.length*2];
              for (int i=0; i < asData.length; i++) {
                  newArray[i] = asData[i];
              }
              asData = newArray;
      }
          if (index > 0 || index <iSize){
System.out.println("2");
             throw new IllegalArgumentException("index (" + index + ") must be greater than zero and less than size (" + iSize + ")");
          }
System.out.println("asData[" + index + "]=" + asData[index] + "");

          if (asData[index] != ""){
System.out.println("3");
              for (int i = 0; i <iSize; i++){
System.out.println("i=" + i + ", setting s to ");
                 s = asData[index];
              }
          }
          asData[index] = s;
          iSize++;
      }
}

答案 1 :(得分:0)

编辑:关于if (index > 0 || index <iSize)的其他评论。除了下面提到的和/和问题,为什么索引必须高于零?零是有效的数组索引。

这是我运行更新代码时得到的结果:

asData.length=2, iSize=2
1
2
asData[0]=null
3
i=0, setting s to
i=1, setting s to
hello, asData.length=4, iSize=3
2
asData[1]=null
3
i=0, setting s to
i=1, setting s to
i=2, setting s to
goodbye,

所有这些i=0, setting s to都是个问题。为什么要将s设置为任何,更不用说重复设置了?然后你将这个值设置到数组中,这没有任何意义,因为那是只是的来源。要强调:参数s在您使用它之前会被覆盖,而数组 永远不会改变

此代码:

if(index > 0 || index <iSize){
   throw new IllegalArgumentException("index (" + index + ") must be greater than zero and less than size iSize + ")"); 
}

想一想。 ||是“或”,但错误消息显示“和”

我仍然没有解决我在原始答案中提到的双倍数组但只有增量问题,size问题以及asData[index] != ""问题。


我必须去睡觉,但我希望这些观察结果能帮助你顺利上路。祝你好运Jarmaloon,我期待看到真正有效的代码的最终更新!