【问题标题】:finding maximum number in ArrayList在 ArrayList 中查找最大数
【发布时间】:2014-06-22 15:14:01
【问题描述】:

这是我在即将进行的测试之前的练习,我试图让用户输入一个数字。并且array1 中低于用户编号的所有元素都将被放入一个新的ArrayList 中。 然后我试图只打印该 ArrayList 中的最高数字。如果用户输入小于 array1 中的所有数字,它将返回 -1。 这是我的代码,但是,当我输入 920 时,它仍然返回 -1,我认为在 ArrayList 中查找最高数字的代码有问题。各位大佬能告诉我怎么回事吗?

static Scanner sc = new Scanner(System.in);
static int[] array1 = {900, 885, 989, 1000, 1500, 1243, 999, 915};

public static int blabla(int[] a, int b) {

Integer d = -1;
ArrayList<Integer> al = new ArrayList<Integer>();

    for (int i = 0; i < array1.length; i++) { // this is to find all numbers in array1 that is below user's number, and add it to the ArrayList
        if (b > array1[i]) {
        al.add(array1[i]);
        } // if
    } // for

    outerloop: // and this function below is to find maximum number in ArrayList
    for (int g = (al.size()-1); g == 0; g--) {
                for (int j = 0; j <=(g-1); j++) {
                    if (al.get(j) > al.get(g)) {
                        break;
                    }
                    else if(j == (g-1)) {
                        if (al.get(g) > al.get(j)){
                            d = al.get(g);
                            break outerloop;
                        }
                    }
                } //for^2
    } // for
return d;
} // priceisright

【问题讨论】:

  • 在你的第一个循环中,你正在循环新创建的 ArrayList 的元素,但是这个新创建的 ArrayList 是空的,所以这个循环甚至不会运行。您的意思是循环遍历传递的 Array 的元素吗?
  • 如果你给你的变量和方法一个有意义的名字,并且如果你委托给方法而不是把所有东西放在一个单一的一个中,你会更容易理解你自己的代码。您还应该重新考虑您的算法。为什么需要两个嵌套循环来查找列表中的最大元素?您需要做的就是遍历每个元素并将它们中的每一个与当前最大值进行比较。如果更大,则更改当前最大值的值。另请参阅docs.oracle.com/javase/7/docs/api/java/util/…
  • 您可以更有效地找到最大数量(O(n^2) 并不完全有效..)。为什么不首先对其进行排序?
  • @Kon 你是什么意思?新的 ArrayList 是空的,是的,这就是为什么我用 array1 中低于用户编号 (al.add(a1[i])) 的所有数字填充它,还是我错过了什么?
  • @JBNizet 我试图用我的代码做的是,变量 'g' 是 ArrayList 中的最后一个元素,变量 j 是第一个元素,这就是我一个一个比较的方式,我不知道怎么回事

标签: java arrays arraylist


【解决方案1】:
static Scanner sc = new Scanner(System.in);
static int[] array1 = {900, 885, 989, 1000, 1500, 1243, 999, 915};

public static int blabla(int[] a, int b) {

Integer d = -1;
ArrayList<Integer> al = new ArrayList<Integer>();

此时a1是一个空数组,所以a1.length = 0,这个循环永远不会被执行。

    for (int i = 0; i < a1.length; i++) { 
        // this is to find all numbers in array1 that is below user's number, 
        // and add it to the ArrayList
        if (b > a1[i]) {
            al.add(a1[i]);
        } // if
    } // for

a1 那里仍然是空的,第二个循环也不会做任何事情。

    // and this function below is to find maximum number in ArrayList
    outerloop: 
    for (int g = (al.size()-1); g == 0; g--) {
                for (int j = 0; j <=(g-1); j++) {
                    if (al.get(j) > al.get(g)) {
                        break;
                    }
                    else if(j == (g-1)) {
                        if (al.get(g) > al.get(j)){
                            d = al.get(g);
                            break outerloop;
                        }
                    }
                } //for^2
    } // for
return d;
} // priceisright

这个呢:

    // Finds the greater value in values that is below maximum.
    // Returns -1 if none is found. 
    public static int blabla(int[] values, int maximum) {
      int best_value = -1;
      for (int value : values) {
        if (value < maximum && value > best_value) {
          best_value = value;
        }
      }

      return best_value;
    }

如果您的值在 ArrayList 中,您可以将 int[] values 替换为 List&lt;Integer&gt; values

【讨论】:

  • 这样好多了。不需要 ArrayList,只需遍历数组,找到低于用户输入的最大值。
  • 我认为他想将值存储在输入下,如果不是他为什么会这样做?
  • 我估计(Rei 随时纠正我)中间的 ArrayList 只是一个临时存储,用于将操作分成两个简单的操作(提取有效值然后找到最大值),这是一个好方法建造东西。在这种情况下,可以在一个简单的循环中同时执行这两种操作,并生成一个更短、更快的算法,但情况并非总是如此,将复杂的算法分成小块通常是一个好方法。最初的代码可以通过小修复工作,这就是我指出它存在的问题的原因。
  • @NicolasDefranoux 实际上,'a1' 是 array1,我在将其粘贴到此处时对其进行了编辑,因此它更具可读性,但我忘记编辑该 a1,因此人们将其误认为 ArrayList 'al'。对此感到抱歉:/
【解决方案2】:

你可以用这个

 Collections.max(arrayList);

了解更多请阅读Javadoc for Collection.max

【讨论】:

  • 我猜他想写自己的max/sort,而不是使用库函数。
  • 另外,这个函数实际上并不能帮助 OP 实现 - “并且 array1 中低于用户编号的所有元素,都将被放入一个新的 ArrayList 中”
  • 这行得通,谢谢 :D 因为第一个循环已经只将预期的数字放入新的数组列表中。我想知道我的代码有什么问题,虽然:/
  • 这并不能真正回答问题:初始代码有什么问题?
【解决方案3】:

如果你想使用ArrayList,你可以检查线性时间的最大值,

public static Integer getMaximum(List<Integer> coll) {
  if (coll == null) {
    return null;
  }
  Integer i = coll.get(0);
  for (int t = 1; t < coll.size(); t++) {
    Integer v = coll.get(i);
    if (v != null && v > i) {
      i = v;
    }
  }
  return i;
}

或者,您可以将其更改为 SortedSet&lt;Integer&gt; set = new TreeSet&lt;Integer&gt;();,然后最大元素始终为 set.last();

【讨论】:

    【解决方案4】:

    我会通过这个来简化你的两个 for 循环:

            for (int g = 0; g <=(al.size()-1); g++) { //for each value in your new array
                d = (al.get(g)>d)? al.get(g):d; //is current value higher than previous? if not keep old one
            }
    

    【讨论】:

      【解决方案5】:

      无需使用 .max 等内置方法即可在数组或 arrayList(或任何集合)中查找最大值的简单方法

      Int currentMax = 0
      
      For (int i = 0; i < al.length; i++)
      {
        If al[i] > currentMax
        {
          CurrentMax = al[i]
        }
      }
      

      通过我的手机回答了这个问题,所以我为不好的缩进道歉,但你明白了 :)

      【讨论】:

      • 你必须希望列表不只包含负数。
      • 我确实想到了...但是只需从某个负数开始 currentMax 你确定你无法击败... -999999999999 应该可以工作(在有人 cmet 之前更改为双精度数) )
      • 为什么不将 currentMax 设置为列表的第一个元素呢?那总是正确的。同样的算法可以用于任何类型的列表,而不仅仅是数字列表。
      • 是的,我想这也可以——不知道为什么我没有想到这一点。哈哈。但是这个概念是OP所追求的:)
      猜你喜欢
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2012-05-02
      • 1970-01-01
      相关资源
      最近更新 更多