Filtrar un Arraylist en diferentes matrices

Quiero filtrar una sola matriz en partes. Supongamos que tengo un ArrayList de String:

  Array1 = ["2015-01-06","2015-04-06", "2016-06-06","2016-01-06", "2016-05-06","2017-02-06", "2017-04-06","2017-03-06", "2015-03-06","2016-04-06", "2016-02-06","2015-05-06", "2015-01-06","2016-06-06"] 

Quiero que para filtrar en nuevas matrices de acuerdo a sus años, por lo que la salida se verá así:

 arrayA = ["2015-01-06","2015-04-06","2015-03-06","2015-05-06","2015-01-06"] arrayB = ["2016-06-06","2016-01-06","2016-05-06","2016-04-06","2016-02-06","2016-06-06"] arrayC = [""2017-02-06","2017-04-06","2017-03-06""] 

Las matrices se basan en años ahora. No conozco la forma correcta de llevar a cabo esta tarea.

Esto creará un ArrayList cada año

 ArrayList<String> array1 = new ArrayList<String>(); Map<String, List<String>> mapForYear = new TreeMap<String, List<String>>(); for(String date : array1) { String year = date.substring(0,4); if(!mapForYear.containsKey(year)) mapForYear.put(year, new ArrayList<String>()); mapForYear.get(year).add(date); } 

La pregunta fue corregida para incluir la etiqueta de Android, haciendo esto inaplicable para el OP ya que Android no es compatible con Java 8 todavía, lo dejaré en caso de que ayude a alguien que no usa Android sin embargo.


Usando la API Stream, puede crear fácilmente un Map<Integer, List<String>> donde cada clave es un año. Puede utilizar groupingBy(classifier) donde el clasificador extrae el año de la fecha. En este caso, la fecha se analiza con LocalDate.parse pero fácilmente podría extender que al dar su propio formateador.

 public static void main(String[] args) { String[] array = {"2015-01-06","2015-04-06", "2016-06-06","2016-01-06", "2016-05-06","2017-02-06", "2017-04-06","2017-03-06", "2015-03-06","2016-04-06", "2016-02-06","2015-05-06", "2015-01-06","2016-06-06"}; Map<Integer, List<String>> map = Arrays.stream(array) .collect(Collectors.groupingBy(s -> LocalDate.parse(s).getYear())); // or a simple s -> Integer.valueOf(s.substring(0, s.indexOf('-'))) in this case } 

A continuación, puede acceder a la lista que desea de ese mapa.

Eso es fácil si usas java 8 y Stream API. Escribí el siguiente fragmento de código:

 public List<String> getListByYear(String[] array, int year) { return Arrays.stream(array) .filter(s -> s.contains(Integer.toString(year))) .collect(Collectors.toList()); } 

En cuanto a la cuestión, existe tal solución:

 for (String s : array) { int key = LocalDate.parse(s).getYear(); List<String> value = map.get(key); map.put(key, value == null ? new ArrayList<String>() { { add(s); } } : new ArrayList<String>(value) { { add(s); } } ); } 

El mismo resultado que @Tunaki siempre, pero un menos bonito. Si Java 8 no es compatible, será como la alternativa como la solución más compacta.

La salida está aquí:

 { 2016 = [2016-06-06, 2016-01-06, 2016-05-06, 2016-04-06, 2016-02-06, 2016-06-06], 2017 = [2017-02-06, 2017-04-06, 2017-03-06], 2015 = [2015-01-06, 2015-04-06, 2015-03-06, 2015-05-06, 2015-01-06] } 
  • Android drawSelectorOnTop con GridView
  • Android setOnclicklistener parámetro
  • ¿Dónde puedo encontrar una biblioteca JAVA de efectos visuales y manipulación de imágenes?
  • Imagen de Android Rotar con ExifInterface no funciona
  • ¿Dónde debo declarar mis variables?
  • Android escalonado / multilínea Linear Layout?
  • Biblioteca FFT en android Sdk
  • ¿Usando la cadena del recurso XML en el interruptor?
  • Conversión entre mensaje y cadena en android?
  • Implementar la aplicación de Android. Falta la tarea 'installReleaseDebug' para gradle
  • Error de Eclipse directamente después de @SuppressWarnings ("unchecked")
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.