Как организовывать array?

Как я делаю для того, чтобы эта программа организовала данные в том же самом Array так что сначала были числа, самые превосходящие 0 и после нули в методе Ordenar()? Например:

Вход

(2,3,0,1,0)

Выход

(2,3,1,0,0)

Здесь posteo код, который я приношу

Scanner leer=new Scanner(System.in);

    for(i=0;i<a.length;i++){
        System.out.print("ingrese posicion["+i+"]=");
        a[i]=leer.nextInt();
    }
    Ordenar();
}//main

static public void Ordenar(){
    //Código que necesito
}
6
задан 16.11.2016, 21:17
5 ответов

Хороший dГ - в Камило, чтобы организовывать Array, они существуют различные mГ©todos распоряжения уже определенные, aquГ - оставил тебе artГ-зад на этом и Ваш implementaciГіn в Java. DespuГ©s, в которое я вижу в твоем одиноком примере, ты нуждаешься в менять нули posiciГіn. из-за которого я recomendarГ - в одну modificaciГіn mГ©todo пузырек воздуха, который serГ - в asГ -

public static void burbuja(int[]matrix){
        int temp;
        for(int i=1;i < matrix.length;i++){
            for (int j=0 ; j < matrix.length- 1; j++){
                if (matrix[j] == 0){
                    temp = matrix[j];
                    matrix[j] = matrix[j+1];
                    matrix[j+1] = temp;
                }
            }
        }
    }

, Введенные

(2,3,0,1,0)

Полученный

(2,3,1,0,0)

AquГ - оставил тебе cГіdigo уже проверено, соединение .

3
ответ дан 24.11.2019, 12:46

То, что я понимаю, состоит в том, что ты не хочешь традиционный "sort", если не, что ты просто желаешь, что 0 находитесь в конце концов, в то время как остальные числа предохраняют Вашу команду в array.

Способ это делать - в 2 этапах:

  1. Скроллировать все числа, которые не нуль к левой стороне.
  2. Наполнять оставшуюся часть array с нулями.

Этот одинокий метод требует максимума array.length x 2 повторения в худшем случае, а следовательно он не является очень дорогим.

Код:

public static void main (String [] args) {
    int[] a = new int[] {0,0,2,3,0,0,0,1,0,4};

    // Primer pase, correr los numeros que no son cero a la izquierda.
    int lastNonZeroIndex = 0;
    for (int i = 0; i < a.length; i++) {
        if (a[i] != 0) {
            if (i != lastNonZeroIndex) {
                a[lastNonZeroIndex] = a[i];
            }
            lastNonZeroIndex++;
        }
    }

    // Segundo pase, llenar el resto del array con ceros.
    for (int i = lastNonZeroIndex; i < a.length; i++) {
        a[i] = 0;
    }

    System.out.println(Arrays.toString(a));
}

Результат:

[2, 3, 1, 4, 0, 0, 0, 0, 0, 0]

4
ответ дан 24.11.2019, 12:46
  • 1
    если есть два непрерывных нуля, этот алгоритм не идет. смени нуль на другой и он вновь не исправляет это – gbianchi♦ 02.11.2016, 20:00
  • 2
    @gbianchi: Я изменил алгоритм. Спасибо за твой комментарий. – sstan 02.11.2016, 20:14
  • 3
    Despu и # 233; s печатания моего ответа я догадался, что она очень похожая на твою. Однако, я инициализирую array прямо вместо того, чтобы помещать потом нули: D – Francisco Romero 02.11.2016, 20:38

Ты можешь инициализировать array, в котором ты будешь сохранять данные, так как ты таким образом убеждаешься, что всей стоимости будет являться 0 по умолчанию.

int[] a = new int[5];

Потом только ты должен сохранять Гєltima posiciГіn, в которой вышел один nГєmero больше, чем нуль, и сохранять в этой posiciГіn новую стоимость большую, чем нуль, который он ввел. Однажды сделанный это, складывать один для того, чтобы следующая стоимость большая, которую нуль вводит в новости ultimaPosicion.

Полная программа quedarГ - в:

public static void main(String[] args) {
         Scanner leer=new Scanner(System.in);
         int[] a = new int[5];
         int ultimaPosicion = 0;
         int numero; 

         /* ORDENACIÓN */ 
         for(int i=0; i<a.length; i++){
            System.out.println("Introduce un número");
            numero = leer.nextInt();
            if(numero != 0){
                a[ultimaPosicion] = numero;
                ultimaPosicion++;
            }
         }

         /* COMPROBAR QUE EL ARRAY ESTÁ ORDENADO */
         for(int j = 0; j < a.length; j++){
             System.out.print(a[j] + " ");
         }
    }

Таким образом, ты можешь уберегаться mГ©todo Упорядочивать и делать распоряжение прямо во вводе данных.

Для ввода:

0 2 0 5 4

TendrГ-Схвати вывод:

2 5 4 0 0

2
ответ дан 24.11.2019, 12:46

Ты должен использовать public static <T> void sort(T[] a, Comparator<? super T> c) и создавать comparador, который делал бы то, что ты хочешь. Одна implementaciГіn serГ - в эту:

int[] array = new int[]{2,3,0,1,0};

    Array array2 = new Array<Integer>();
    for(int i : array){
        array2.add(i);
    }

    array2.sort(new Comparator(){

        @Override
        public int compare(Object o1, Object o2) {
            return ((Integer)o1 == 0)?1:-1;
        }

    });

    System.out.println(array2);

Вывод:

[1, 3, 2, 0, 0]

1
ответ дан 24.11.2019, 12:46

SegГєn она situaciГіn, который ты выдвигаешь, договоренность ты нуждаешься в том, чтобы упорядочить это despuГ©s, это leГ-do. А именно не tenГ-схватывай это спасенное заблаговременно, sГіlo ты знаешь Вашу длину. В этом случае ты можешь читать это подходящим способом и поддерживать линейную комплексность O (n) в твою функцию.

  Scanner leer=new Scanner(System.in);

  int a_len = 10, j = 0;  
  int[] a = new int[a_len]; // Inicialmente todos los valores son 0

  for(i=0;i<a.length;i++){
      System.out.print("ingrese posicion["+i+"]=");
      a[j]=leer.nextInt();  // Lees en la última posición donde había un 0

      // Ordenar

      if(a[j] != 0)
         ++j;

      // Ordenar
  }
}//main
0
ответ дан 24.11.2019, 12:46