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í:
- ¿Utilizar un carácter unicode en un archivo .java?
- No se puede encontrar la clase de Android CalendarView
- Uploader de archivos Android con php de servidor
- Cómo cambiar / cambiar el tamaño de EditText en el diseño de la tabla?
- Android Bluetooth Serial RFCOMM velocidad baja en baudios / transmisión lenta
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.
- Android - java - WeakReferences con un ArrayList?
- Android Parcelable - Escriba y lea ArrayList <IA> cuando IA es una interfaz
- Cortar un cuadrado translúcido en una textura
- ¿Dónde está jarsigner?
- Cómo mantener una versión gratuita y pagada de una aplicación
- No se pueden recibir paquetes UDP adecuados mediante SSDP
- Java.io.NotSerializableException incluso si implemento "Serializable"
- La generación de grados falla para la excepción de host desconocido
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] }
- Descodificación de Base64 para image / jpeg; base64 en android
- El método getText () debe ser llamado desde el subproceso de interfaz de usuario (Android Studio)