我必须读取一个arrayList,如果有任何负数,则抛出异常,除了-1(在列表中是预期的)。我得到了如何查找负数但我无法弄清楚如何在列表中允许-1。
for(int i = 0; i <= list.size(); i++){
if(list.get(i) <= 0){
throw new IllegalArgumentException();
}
}
答案 0 :(得分:1)
为了允许一个唯一的否定,您可以继承ArrayList:
public class MyArrayList<T extends Number> extends ArrayList<T> {
private boolean hasNegative = false;
@Override
public boolean add(T t) {
if(t != null && t.floatValue() < 0) {
if(hasNegative) {
throw new IllegalArgumentException("Negative element are not allowed anymore !");
}
hasNegative = true;
}
return super.add(t);
}
}
使用它:
List<Integer> lst = new MyArrayList<Integer>();
lst.add(1);
lst.add(-1);
lst.add(3);
lst.add(-4); // Throw IllegalArgumentException because there is already -1
答案 1 :(得分:0)
如果列表中不允许使用负值,请使用其他列表类型
例如
class NonNegativeList extends ArrayList<Integer> {
@Override
public boolean add(Integer x) {
if (x < -1) throw IllegalArgumentException();
super.add(x);
}
}
至于&#34;在arrayList&#34;中只允许一个否定,添加一个布尔值
class NonNegativeList extends ArrayList<Integer> {
boolean negativeAdded;
@Override
public boolean add(Integer x) {
if (x < -1) throw IllegalArgumentException();
if (negativeAdded) return;
if (!negativeAdded && x < 0) {
negativeAdded = true;
}
super.add(x);
}
}
答案 2 :(得分:0)
您的代码存在一些问题。首先,您应该在 i
具有值list.size()
之前停止循环。 (实际上,由于未使用元素的索引,您可以使用enhanced for
loop,这是我在下面显示的内容。)其次,您需要测试所需的条件,而不是每个元素都是{{ 1}}。
您没有说明列表中包含哪种值。如果它们是整数类型(例如,<= 0
),那么应该这样做:
Integer
如果它们是浮点类型(例如,for (Integer val : list) {
if (val < -1) {
throw new IllegalArgumentException();
}
}
),则需要稍微复杂的测试来筛选像-0.5这样的值:
Float
另请注意,如果列表中包含for (Float val : list) {
if (val < 0 && val != -1) {
throw new IllegalArgumentException();
}
}
个条目,您还需要对其进行测试(或者该方法将为此类列表抛出null
的文档)。