2014-06-22 4 views
3

Это моя практика перед моим предстоящим тестом, я пытаюсь заставить пользователя ввести число. И все элементы в массиве 1, которые ниже номера пользователя, будут помещены в новый ArrayList. , а затем я пытаюсь напечатать только самое высокое число в этом ArrayList. Если пользовательский ввод меньше, чем все число в массиве1, он будет возвращать -1. вот мой код, однако, когда я положил 920, он все равно возвращает -1, я думаю, что в моем коде есть что-то не так, чтобы найти наибольшее число в ArrayList. Можете ли вы, ребята, сказать мне, что не так?нахождение максимального числа в 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 
+0

в вашем первом цикле, вы цикл по элементам вновь созданной ArrayList, но этот новый Созданный ArrayList пуст, поэтому этот цикл даже не запускается. Вы хотите вместо этого перебрать элементы переданного массива? – Kon

+4

Вам было бы намного легче понять свой собственный код, если бы вы дали переменным и методам значимое имя, и если вы делегировали методы вместо того, чтобы помещать все в один. Вы также должны подумать о своем алгоритме. Зачем вам нужно два вложенных цикла, чтобы найти максимальный элемент в списке? Все, что вам нужно сделать, - это цикл каждого элемента и сравнить каждый из них с текущим максимумом. Если больше, то измените значение текущего максимума. Также см. Http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#max%28java.util.Collection%29 –

+1

. Вы можете найти максимальное число более эффективно (O (n^2) не совсем эффективна.). Почему бы не отсортировать его в первую очередь? – TheLostMind

ответ

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

Вы можете заменить int[] values на List<Integer> values, если ваши значения находятся в ArrayList.

+0

Это лучше. Нет необходимости в ArrayList, просто пройдите через массив, найдя максимальное значение, которое ниже пользовательского ввода. – francoisr

+0

Я думаю, что он хочет хранить значения под входными данными, почему бы ему это сделать, если нет? – skoll

+0

Я оценил (Рей не стесняйтесь меня исправлять), промежуточный ArrayList был всего лишь временным хранилищем, чтобы разделить операцию на две простые (извлеките допустимые значения, затем найдите max), что является хорошим способом создания вещей. В этом случае возможно выполнение как простых циклов, так и более быстрый и быстрый алгоритм, но это не всегда так, и сложный алгоритм в небольших кусках обычно является хорошим подходом. Первоначальный код мог работать с небольшими исправлениями, поэтому я указал на проблемы, которые у него были. –

3

Вы можете использовать этот

Collections.max(arrayList); 

Чтобы узнать больше о чтении Javadoc for Collection.max

+0

Думаю, он хочет написать свой собственный макс/сорт, а не использовать библиотечные функции. – Niemand

+0

, эта функция фактически не помогла бы достижению OP - «И все элементы в массиве1, которые ниже номера пользователя, будут помещены в новый ArrayList» – TheLostMind

+2

@Niemand Я только что предложил библиотечную функцию – rachana

1

Если вы хотите использовать 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<Integer> set = new TreeSet<Integer>();, затем m aximum элемент всегда set.last();

1

Я бы упростить два для петель с помощью этого:

 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 
     } 
1

Простой способ найти максимум в массиве или ArrayList (или любой коллекции на самом деле) без использования встроенных методов, таких как .max

Int currentMax = 0 

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

Ответил это с телефона, так что я прошу прощения за плохие абзацы, но вы получите идею :)

+0

Вы должны надеяться, что список содержит не только отрицательные числа. –

+0

Я действительно об этом подумал ... Но просто запустите currentMax при некотором отрицательном числе, вы уверены, что не можете бить ... -999999999999 должны работать (сменить на двойную, а также до того, как кто-то пойдет на это) –

+0

Почему бы не установить currentMax на первый элемент списка вместо этого? Это было бы правильно всегда. И тот же алгоритм может быть использован для любого kinf списка, а не только для списков чисел. –

Смежные вопросы