我试图编写一个方法,它返回一个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)
有什么想法吗?
答案 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,我期待看到真正有效的代码的最终更新!