【问题标题】:Allowing only one negative in arrayListarrayList 中只允许一个负数
【发布时间】:2017-06-05 18:23:06
【问题描述】:

我必须通读 arrayList 并抛出异常,如果有任何负数,除了 -1(在列表中是预期的)。我知道如何查找负数,但我不知道如何在列表中允许 -1。

for(int i = 0; i <= list.size(); i++){
    if(list.get(i) <= 0){
        throw new IllegalArgumentException();
    }
}

【问题讨论】:

  • &lt;= 0 时抛出异常,而不是 &lt; -1 时抛出异常
  • if (list.get(i)
  • @cricket_007:我的意思是。这不是计算问题,而是基本代数问题。
  • if(list.get(i) &lt; -1){
  • 另外,i &lt;= list.size() 本身也会为 list.get(i) 抛出异常

标签: java for-loop arraylist


【解决方案1】:

如果列表中不允许有负值,请使用不同的列表类型

例如

class NonNegativeList extends ArrayList<Integer> {

    @Override
    public boolean add(Integer x) {
        if (x < -1) throw IllegalArgumentException();
        super.add(x);
    }   
}

至于“在arrayList中只允许一个负数”,添加一个布尔值

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);
    }   
}

【讨论】:

  • OP 的问题似乎是筛选作为参数传递的列表中的错误值。这是定义一个拒绝错误值的列表的好方法,但似乎不能解决 OP 本身的问题。 (当然,OP 可能会询问XY problem。)另外,我在 OP 的问题中没有看到“only onenegative”引用。这是从哪里来的?
  • @TedHopp 标题。
  • @SotiriosDelimanolis - 哦。我将其解释为列表中只允许一个负值 (-1),而不是只允许一个负值的一个实例。 (我和我妻子一直都这样;如果有两种理解方式,我们总是会产生分歧。)
【解决方案2】:

您的代码存在一些问题。首先,您应该停止循环之前 i 具有值list.size()。 (实际上,由于没有使用元素的索引,所以可以使用enhanced for loop,这是我在下面展示的。)其次,您需要测试您想要的条件,而不是每个元素都是&lt;= 0

您没有说明列表中包含哪些类型的值。如果它们是整数类型(例如,Integer),那么应该这样做:

for (Integer val : list) {
    if (val < -1) {
        throw new IllegalArgumentException();
    }
}

如果它们是浮点类型(例如,Float),您需要稍微复杂一点的测试来筛选像 -0.5 这样的值:

for (Float val : list) {
    if (val < 0 && val != -1) {
        throw new IllegalArgumentException();
    }
}

另请注意,如果列表可以包含 null 条目,您还需要对此进行测试(或记录该方法将为此类列表抛出 NullPointerException)。

【讨论】:

    【解决方案3】:

    为了允许唯一的否定,你可以继承 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
    

    【讨论】:

    • 如果列表有浮点值,那将无法正常工作。通过使用intValue(),像-0.5 这样的条目将通过测试,因为intValue() 将返回0。
    • 谢谢,没错。我用doubleValue()编辑过
    • 好多了。当然,floatValue() 也适用于此,因为float 可以准确地表示 -1。
    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多