martes, 26 de diciembre de 2017

Ordenar un arreglo en paralelo en Java 8

Java 8 trae muchas mejoras, tal vez la más importante es que podemos utilizar clausuras o closures en ingles. Pero a la vez Java 8 trae una cantidad interesantes de métodos que utilizan esta nueva propiedad, y a la vez nos brindan mayor facilidad para resolver problemas.

A la vez Java 8 proporciona una nueva característica que es ordenar un vector en paralelo. El método Arrays.sort() se usa para ordenar, pero java 8 proporciona un método nuevo que es el método parallelSort() para ordenar paralelamente los elementos de un vector.

El método parallelSort() pertenece a la clase Arrays, que está disponible en el paquete java.util. El método parallelSort() es más rápido que el método Array.sort() y este método sigue a fork / join framework para asignar las tareas de clasificación a varios subprocesos que están disponibles en el grupo de subprocesos. El método parallelSort () está sobrecargado para todos los tipos de datos primitivos y objetos que implementen Comparable<T>.

Veamos un simple ejemplo de como ordenar con este metodo:

import java.util.Arrays;

class ParallelSortExample
{
      public static void main(String args[]) {
            //Creamos un vector de enteros
            int a[] = {50, 10, 90, 40, 80};
            //Ahora los ordenamos
            Arrays.parallelSort(a);
            for(int i : a) {
                  System.out.println(i);
            }
      }
}

Output: 10
             40
             50
             80
             90

También podemos pasarle un Comparator que indique como debe ordenar, veamos un ejemplo:

package com.concretepage;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Consumer;

public class ParallelSortWithComparator {

      public static void main(String[] args) {
             User[] users = User.getUsers();
            Comparator<User> ageComparator = Comparator.comparing(User::getAge);
            System.out.println("--Sort complete array--");
            Arrays.parallelSort(users, ageComparator);
            Consumer<User> printUser = u-> System.out.println(u.getName()+"-"+u.getAge());
            Arrays.stream(users).forEach(printUser);
            System.out.println("--Sort array from index 1 to 4--");
            users = User.getUsers();
            Arrays.parallelSort(users, 1, 4, ageComparator);
            Arrays.stream(users).forEach(printUser);
      }

}