Categorías
Top 10

8 cosas que los programadores pueden hacer los fines de semana

Los fines de semana son un momento importante para desconectarse del trabajo diario y recargarse. También son una buena oportunidad para pensar más profundamente sobre las cosas.

El programador de software (desarrollador o ingeniero) es una ocupación especial en comparación con otras, aunque muchos trabajos requieren el uso de computadoras. Inspirado por «14 cosas que las personas exitosas hacen los fines de semana» escrito por Jacquelyn Smith, en este post resumo el beneficioso cosas que los programadores pueden hacer los fines de semana. Con suerte, si es un programador y está planificando su fin de semana, esto puede proporcionarle algunas ideas.

1. Dedique tiempo a la familia y los amigos.

Los programadores en el campo de la tecnología suelen estar muy ocupados los días de semana, por lo que los fines de semana son un momento importante para estar con familiares y amigos. Esto es común con personas de otras áreas.

2. Día sin computadora.

no hay computadora

Algunas personas han probado el día sin tecnología, lo que significa que no usan ninguna tecnología durante el día. Puede que no sea realista estar totalmente desconectado de las computadoras, pero al menos algunas pueden evitarse. Sin computadora básicamente significa que no hay trabajo relacionado con la computadora.

3. Actividades al aire libre: Senderismo, Ciclismo, Correr, Pesca, Paseos en bote.

pescar

Si puede realizar esas actividades o no, puede depender del lugar donde viva. Sin embargo, los parques estatales están en todas partes, al menos deberías poder hacer algunos de ellos.

4. Actividades en casa: cocina, jardinería, etc.

Cocinando

Esas son cosas que se pueden hacer con la familia en casa.

5. Leer libros por diversión o por tecnología.

leyendo

La investigación ha demostrado que la lectura es buena para el cerebro. No solo puede convertirlo en un ser humano empático, sexy, culto y en general más interesante, sino que también puede proporcionar beneficios para su salud mental, agudizando la mente a medida que envejece. Si necesita un ambiente pacífico para leer, puede ir a una escuela o biblioteca pública para ser un ratón de biblioteca por un tiempo.

6. Escribir un diario / blogs.

escritura-blogging-clipart1

Escribir puede ayudar a organizar los pensamientos, lograr claridad y mantener despejado su espacio interior.

7. Dibuje algunos diagramas y simplifique las cosas difíciles.

pencil_4

Si escribir es demasiado anticuado, también puede dibujar algunos diagramas por diversión. Puedes dibujarlo en papel. También hay muchas herramientas agradables en línea para crear hermosos diagramas, como Lucidchart, infografías, MindMeister, la herramienta Sea Quail Database Diagram, etc.

8. Red.

reunirse
La red es importante, no solo para los empresarios, sino también para los programadores. Hay muchos grupos en meetup.com. Las personas que viven en las grandes ciudades pueden encontrar fácilmente un grupo interesante y conocer gente que tenga los mismos intereses.

Deje su comentario si tiene otras buenas ideas.

Categorías
Top 10

100 blogs de desarrolladores de Java de alta calidad

La intención de esta página es recopilar los mejores 100 blogs de Java y ayudar a los programadores a encontrar buenas publicaciones de blogs para leer. Es posible que algunos de estos blogs no estén escritos por desarrolladores de Java, pero los desarrolladores de Java deberían encontrarlos útiles o interesantes. Leer esos blogs debería ser divertido y, a menudo, aportar algunas ideas nuevas.

Mi definición de alta calidad es la siguiente:

  1. Los artículos son legibles y tienen originalidad.
  2. Su autor muestra un interés real por la tecnología.
  3. Contiene pensamiento creativo desde el entendimiento personal.
  4. Debería actualizarse con regularidad.

Puede sugerir un blog publicando un comentario a continuación. A medida que esta lista crece, solo proporcione buenos sitios.

Nota: la lista no está ordenada. Eso significa que hacer clic en el primero o elegir uno al azar no hace ninguna diferencia si no ve sus áreas específicas.

Nombre(Sitio / Personas) País Area específica
0 Búsqueda de código America # 1 herramienta de búsqueda de código (publicidad)
1 Adam Bien Alemania Java EE
2 Antonio Goncalves Francia Autor de Java EE 7
3 Henrik Warne Suecia Reflexiones sobre la programación
4 Billy Yarosh America Curas de codificación
5 Lars Vogel Alemania Android y Eclipse
6 Peter Verhas Hungría Java puro
7 Martin Fowler America Autor, Ponente
8 Bozhidar Bozhanov Bulgaria Java EE
9 Richard Warburton Reino Unido Java 8 Lambdas
10 Bear Giles America Java EE
11 Marginalmente interesante Alemania Aprendizaje automático
12 Pascal Alma America Java EE
13 Ayudante de Dror America Consultor
14 Juri Strumpflohner Italia JavaScript
15 Reza Rahman America Java EE / Glassfish
dieciséis Phil Whelan Canadá Web
17 Brett Porter Australia Coautor de Apache Maven 2
18 Ben McCann America Co-fundador en Connectifier
19 Posse de Java America Algunos enlaces útiles
20 Mark Needham Reino Unido Datos
21 Iris Shoor Israel Depurar
22 Yifan Peng America Estudiante graduado
23 Nikita Salnikov Tarnovski Estonia Pérdidas de memoria
24 Dustin Marx America Eventos actuales
25 Bart Bakker Holanda Ágil
26 Gunnar Peipman America no Java
27 Dave Fecak America Consejos de trabajo para programadores
28 JOOQ Suiza SQL
29 Petri Kainulainen Finlandia Web
30 Informatech CR Costa Rica
31 Arun Gupta America Java EE
32 Simpatía mecánica Reino Unido Actuación
33 Entusiasmo extremo Italia Ágil
34 Steve Blank America Autor del manual del propietario de inicio
35 Oliver Gierke Alemania SpringSource
36 Nicolas Fränkel Suiza Java EE
37 Blaise Doughan America XML y JSON
38 Vlad Mihalcea Rumania Integración de software
39 Kevin Lee Australia Web
40 Mikhail Vorontsov Australia Actuación
41 Jakob Jenkov Dinamarca Arquitectura de software
42 Jim Weaver Rich Client Java
43 Jonathan Giles Nueva Zelanda Java FX
44 Stephen Chin America Java FX
45 Matt Raible America Marcos de código abierto
46 Peter Lawrey Reino Unido Core Java
47 Gregor Riegler Austria Diseño OO, XP
48 Jos Dirksen Países Bajos SOA, HTML 5
49 Alexander J. Turner Reino Unido Información, noticias y opiniones
50 Adviento de Java
51 John Purcell Hungría Tutoriales
52 JARRA Transilvania Reino Unido
53 Raíces de Java Primavera
54 Entrenamiento Java Grecia capacitación
55 Allan Kelly Reino Unido Software
56 Samuel Santos Portugal Java EE
57 Steve Smith Reino Unido Ágil
58 Niklas Schlimm Alemania Multihilo
59 Shrutarshi Basu America Doctorado, Ciencias de la Computación
60 Anton Arhipov Estonia Java EE
61 Charles Nutter America JVM
62 RedStack America SOA, JVM
63 James Bloom America JVM
64 Pierre-Hugues Charbonneau Canadá Java EE
sesenta y cinco Eugen Paraschiv Rumania Java Web
66 Wayne Beaton America Eclipse
67 Jeff Atwood America Desbordamiento de pila
68 Stuart Marks America Oráculo
69 Ben Stopford Reino Unido Plataforma de datos
70 Aleksey Shipilëv Rusia Rendimiento y simultaneidad de Java
Programa Creek America Comprensión profunda de Java Core

Deje su comentario si conoce algunos blogs de Java de alta calidad o si encuentra algún error en la lista anterior. Seguiré actualizando esta lista, ¡pero la limitaré a 100! Como esta lista está siendo leída por miles de personas, si no quieres estar en la lista, también puedo quitar tu blog de la lista.

* A veces no es fácil encontrar blogs de alta calidad mediante búsquedas. Tal vez porque no hacen SEO o porque Google prefiere sitios más grandes. Por el contrario, hay muchos sitios que tienen muchos visitantes, pero es posible que no tengan una alta calidad. Por lo tanto, muchos de los blogs que Google ocupa un lugar destacado no aparecerán en esta lista. Esta colección refleja mi opinión personal. No todos los enlaces de los comentarios se agregarán a la lista.

Categorías
Collections Top 10

Métodos de uso frecuente de Java HashMap

HashMap es muy útil cuando se requiere un contador.

HashMap<String, Integer> countMap = new HashMap<String, Integer>();
 
//.... a lot of a's like the following
if(countMap.keySet().contains(a)){
	countMap.put(a, countMap.get(a)+1);
}else{
	countMap.put(a, 1);
}

1. Recorrer HashMap

Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry)it.next();
    System.out.println(pairs.getKey() + " = " + pairs.getValue());
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

2. Imprimir HashMap

public static void printMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        System.out.println(pairs.getKey() + " = " + pairs.getValue());
        it.remove(); // avoids a ConcurrentModificationException
    }
}

3. Ordenar HashMap por valor

El siguiente ejemplo de código aprovecha un constructor de TreeMap aquí.

class ValueComparator implements Comparator<String> {
 
    Map<String, Integer> base;
 
    public ValueComparator(Map<String, Integer> base) {
        this.base = base;
    }
 
    public int compare(String a, String b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}
HashMap<String, Integer> countMap = new HashMap<String, Integer>();
//add a lot of entries
countMap.put("a", 10);
countMap.put("b", 20);
 
ValueComparator vc =  new ValueComparator(countMap);
TreeMap<String,Integer> sortedMap = new TreeMap<String,Integer>(vc);
 
sortedMap.putAll(countMap);  
 
printMap(sortedMap);

Hay diferentes formas de ordenar HashMap, esta forma ha sido la más votada en stackoverflow.

Categorías
Natural Language Processing Top 10

Las 8 mejores herramientas para el procesamiento del lenguaje natural

El texto en inglés se usa en casi todas partes. Sería mejor si nuestro sistema pudiera entenderlo y generarlo automáticamente. Sin embargo, comprender el lenguaje natural es una tarea complicada. Es tan complicado que muchos investigadores dedicaron toda su vida a hacerlo.

Hoy en día, se han publicado muchas herramientas para realizar trabajos de procesamiento del lenguaje natural. Las siguientes son 8 herramientas que he recopilado. También verifiqué que todas ellas son utilizadas por algunas aplicaciones al menos una vez, por lo que todas son ejecutables. Algunos de ellos de empresas del sector, otros de institutos de investigación. Proporciona funciones como analizar, buscar temas automáticamente, etc.

  • OpenNLP: un paquete de Java para realizar tokenización de texto, etiquetado de parte del discurso, fragmentación, etc. (tutorial)
  • Stanford Parser: una implementación Java de analizadores probabilísticos de lenguaje natural, tanto PCFG * altamente optimizados como analizadores de dependencia lexicalizados, y un analizador PCFG lexicalizado
  • ScalaNLP: procesamiento de lenguaje natural y aprendizaje automático.
  • Snowball: un lematizador, compatible con C y Java.
  • MALLET: un paquete basado en Java para procesamiento estadístico de lenguaje natural, clasificación de documentos, agrupamiento, modelado de temas, extracción de información y otras aplicaciones de aprendizaje automático a texto.
  • JGibbLDA: LDA en Java
  • Apache Lucene Core: una biblioteca de Java para la eliminación y derivación de palabras vacías
  • Caja de herramientas de modelado de temas de Stanford: algoritmo CVB0, etc.

* PCFG: Gramática libre de contexto probabilístico

Categorías
Basics Top 10

Los 10 métodos principales para matrices Java

Los siguientes son los 10 métodos principales para Java Array. Son las preguntas más votadas de stackoverflow.

0. Declare una matriz

String[] aArray = new String[5];
String[] bArray = {"a","b","c", "d", "e"};
String[] cArray = new String[]{"a","b","c","d","e"};

1. Imprime una matriz en Java

int[] intArray = { 1, 2, 3, 4, 5 };
String intArrayString = Arrays.toString(intArray);
 
// print directly will print reference value
System.out.println(intArray);
// [[email protected]
 
System.out.println(intArrayString);
// [1, 2, 3, 4, 5]

2. Cree una ArrayList a partir de una matriz

String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
System.out.println(arrayList);
// [a, b, c, d, e]

3. Verifique si una matriz contiene un cierto valor

String[] stringArray = { "a", "b", "c", "d", "e" };
boolean b = Arrays.asList(stringArray).contains("a");
System.out.println(b);
// true

4. Concatenar dos matrices

int[] intArray = { 1, 2, 3, 4, 5 };
int[] intArray2 = { 6, 7, 8, 9, 10 };
// Apache Commons Lang library
int[] combinedIntArray = ArrayUtils.addAll(intArray, intArray2);

5. Declare una matriz en línea

method(new String[]{"a", "b", "c", "d", "e"});

6. Une los elementos de la matriz proporcionada en una sola cadena

// containing the provided list of elements
// Apache common lang
String j = StringUtils.join(new String[] { "a", "b", "c" }, ", ");
System.out.println(j);
// a, b, c

7. Covnerte una ArrayList a una matriz

String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
String[] stringArr = new String[arrayList.size()];
arrayList.toArray(stringArr);
for (String s : stringArr)
	System.out.println(s);

8. Convierta una matriz en un conjunto.

Set<String> set = new HashSet<String>(Arrays.asList(stringArray));
System.out.println(set);
//[d, e, b, c, a]

9. Invierta una matriz

int[] intArray = { 1, 2, 3, 4, 5 };
ArrayUtils.reverse(intArray);
System.out.println(Arrays.toString(intArray));
//[5, 4, 3, 2, 1]

10. Eliminar elemento de una matriz

int[] intArray = { 1, 2, 3, 4, 5 };
int[] removed = ArrayUtils.removeElement(intArray, 3);//create a new array
System.out.println(Arrays.toString(removed));

Uno más: convierta int en matriz de bytes

byte[] bytes = ByteBuffer.allocate(4).putInt(8).array();
 
for (byte t : bytes) {
   System.out.format("0x%x ", t);
}

Categorías
Basics Top 10

Las 10 preguntas principales de las cadenas de Java

Las siguientes son las 10 preguntas más frecuentes acerca de las cadenas de Java.

1. ¿Cómo comparar cadenas? ¿Usar «==» o usar igual ()?

En resumen, «==» prueba si las referencias son iguales y equals () prueba si los valores son iguales. A menos que desee verificar si dos cadenas son el mismo objeto, siempre debe usar equals ().

Sería mejor si conociera el concepto de prácticas de cuerdas.

2. ¿Por qué char[] preferido sobre String para información confidencial de seguridad?

Las cadenas son inmutables, lo que significa que una vez que se crean, permanecerán sin cambios hasta que Garbage Collector se active. Con una matriz, puede cambiar explícitamente sus elementos. De esta manera, la información confidencial de seguridad (por ejemplo, contraseña) no estará presente en ninguna parte del sistema.

3. ¿Podemos usar una cadena para la declaración de cambio?

Sí a la versión 7. Desde JDK 7, podemos usar una cadena como condición de cambio. Antes de la versión 6, no podemos usar una cadena como condición de cambio.

// java 7 only!
switch (str.toLowerCase()) {
      case "a":
           value = 1;
           break;
      case "b":
           value = 2;
           break;
}

4. ¿Cómo convertir cadenas a int?

int n = Integer.parseInt("10");

Simple, pero de uso frecuente y, a veces, ignorado.

5. ¿Cómo dividir una cadena con espacios en blanco?

String[] strArray = aString.split("s+");

6. ¿Qué método de subcadena () realmente hace?

En JDK 6, el método substring () da una ventana a una matriz de caracteres que representa la Cadena existente, pero no crea una nueva. Para crear una nueva cadena representada por una nueva matriz de caracteres, puede agregar una cadena vacía como la siguiente:

str.substring(m, n) + ""

Esto creará una nueva matriz de caracteres que representará la nueva cadena. El enfoque anterior a veces puede hacer que su código sea más rápido, porque Garbage Collector puede recolectar la cadena grande no utilizada y conservar solo la subcadena.

En Oracle JDK 7, substring () crea una nueva matriz de caracteres, no usa la existente. Consulte el diagrama para mostrar la diferencia de subcadena () entre JDK 6 y JDK 7.

7. String vs StringBuilder vs StringBuffer

String vs StringBuilder: StringBuilder es mutable, lo que significa que puede modificarlo después de su creación.
StringBuilder vs StringBuffer: StringBuffer está sincronizado, lo que significa que es seguro para subprocesos pero más lento que StringBuilder.

8. ¿Cómo repetir una cadena?

En Python, podemos simplemente multiplicar un número para repetir una cadena. En Java, podemos usar el método repeat () de StringUtils del paquete Apache Commons Lang.

String str = "abcd";
String repeated = StringUtils.repeat(str,3);
//abcdabcdabcd

9. ¿Cómo convertir cadenas a la fecha?

String str = "Sep 17, 2013";
Date date = new SimpleDateFormat("MMMM d, yy", Locale.ENGLISH).parse(str);
System.out.println(date);
//Tue Sep 17 00:00:00 EDT 2013

10. ¿Cómo contar el número de apariciones de un carácter en una cadena?

Utilice StringUtils de apache commons lang.

int n = StringUtils.countMatches("11112222", "1");
System.out.println(n);

Uno mas
¿Sabes cómo detectar si una cadena contiene solo letras mayúsculas?

Categorías
Basics Java Top 10

Los 8 mejores diagramas para comprender Java

Un diagrama a veces vale 1000 palabras. Los siguientes diagramas son de tutoriales de Java en Program Creek, han recibido la mayor cantidad de votos hasta ahora. Con suerte, pueden ayudarlo a revisar lo que ya sabe. Si el problema no está claro en el diagrama en sí, es posible que desee ir a cada artículo para profundizar.

1. Inmutabilidad de las cuerdas

El siguiente diagrama muestra lo que sucede con el siguiente código:

String s = "abcd";
s = s.concat("ef");

2. El contrato equals () y hashCode ()

HashCode está diseñado para mejorar el rendimiento. El contrato entre equals () y hasCode () es que:
1. Si dos objetos son iguales, entonces deben tener el mismo código hash.
2. Si dos objetos tienen el mismo código hash, pueden ser iguales o no.

java-hashcode

3. Jerarquía de clases de excepción de Java

De color rojo son excepciones marcadas que deben ser capturadas o declaradas en la cláusula throws del método.

Diagrama de jerarquía de excepciones

4. Jerarquía de clases de colecciones

Tenga en cuenta la diferencia entre colecciones y colección.


5. Sincronización de Java

El mecanismo de sincronización de Java se puede ilustrar mediante una analogía con un edificio.

6. Alias

La creación de alias significa que hay varios alias en una ubicación que se pueden actualizar, y estos alias tienen diferentes tipos.

Alias ​​de Java

7. Apilar y amontonar

Este diagrama muestra dónde están los métodos y los objetos en la memoria en tiempo de ejecución.

Java-matriz-en-memoria

8. Áreas de datos en tiempo de ejecución de JVM

Este diagrama muestra áreas generales de datos en tiempo de ejecución de JVM.

Área de datos de tiempo de ejecución de JVM

Categorías
Basics Classes & Interfaces Collections Top 10

Las 10 preguntas principales sobre las colecciones de Java

Las siguientes son las preguntas más populares de las colecciones de Java formuladas y discutidas en Stackoverflow. Antes de mirar esas preguntas, es una buena idea ver el diagrama de jerarquía de clases.

1. ¿Cuándo usar LinkedList sobre ArrayList?

Lista de arreglo es esencialmente una matriz. Se puede acceder a sus elementos directamente por índice. Pero si la matriz está llena, se necesita una nueva matriz más grande para asignar y mover todos los elementos a la nueva matriz tomará En) hora. Además, agregar o eliminar un elemento necesita mover elementos existentes en una matriz. Esta podría ser la mayor desventaja para usar ArrayList.

Lista enlazada es una lista de doble enlace. Por tanto, para acceder a un elemento en el medio, tiene que buscar desde el principio de la lista. Por otro lado, agregar y eliminar un elemento en LinkedList es más rápido, porque solo cambia la lista localmente.

En resumen, el peor caso de comparación de la complejidad del tiempo es el siguiente:

                   | Arraylist | LinkedList
 ------------------------------------------
 get(index)        |    O(1)   |   O(n)
 add(E)            |    O(n)   |   O(1)
 add(E, index)     |    O(n)   |   O(n)
 remove(index)     |    O(n)   |   O(n)
 Iterator.remove() |    O(n)   |   O(1)
 Iterator.add(E)   |    O(n)   |   O(1)

A pesar del tiempo de ejecución, el uso de la memoria también debe considerarse especialmente para listas grandes. En Lista enlazada, cada nodo necesita al menos dos punteros adicionales para vincular los nodos anterior y siguiente; mientras en Lista de arreglo, solo se necesita una serie de elementos.

Más comparaciones entre lista.

2. Equivalente eficiente para eliminar elementos mientras se itera la colección

La única forma correcta de modificar una colección mientras se itera es usando Iterador.retirar(). Por ejemplo,

Iterator<Integer> itr = list.iterator();
while(itr.hasNext()) {
   // do something
   itr.remove();
}

Uno mas frecuente incorrecto el código es

for(Integer i: list) {
  list.remove(i);
}

Obtendrás un ConcurrentModificationException ejecutando el código anterior. Esto se debe a que se ha generado un iterador (en por declaración) para recorrer la lista, pero al mismo tiempo la lista es cambiada por Iterador.retirar(). En Java, «generalmente no está permitido que un subproceso modifique una colección mientras otro subproceso está iterando sobre ella».

3. Cómo convertir List a int[]?

La forma más fácil podría ser usar ArrayUtils en Apache Commons Lang Biblioteca.

int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));

En JDK, no hay atajos. Tenga en cuenta que no puede usar Lista.toArray (), porque eso convertirá Lista a Entero[]. El camino correcto es seguir,

int[] array = new int[list.size()];
for(int i=0; i < list.size(); i++) {
  array[i] = list.get(i);
}

4. Cómo convertir int[] en la lista?

La forma más fácil podría todavía estar usando ArrayUtils en Apache Commons Lang biblioteca, como a continuación.

List list = Arrays.asList(ArrayUtils.toObject(array));

En JDK, tampoco hay atajos.

int[] array = {1,2,3,4,5};
List<Integer> list = new ArrayList<Integer>();
for(int i: array) {
  list.add(i);
}

5. ¿Cuál es la mejor forma de filtrar una colección?

Nuevamente, puede usar un paquete de terceros, como Guayaba o Apache Commons Lang para cumplir con esta función. Ambos proporcionan un filtrar() método (en Colecciones2 de Guayaba y en ColecciónUtils de Apache). La filtrar() El método devolverá elementos que coincidan con un determinado Predicado.

En JDK, las cosas se vuelven más difíciles. Una buena noticia es que en Java 8, Predicado será añadido. Pero por ahora tienes que usar Iterador para recorrer toda la colección.

Iterator<Integer> itr = list.iterator();
while(itr.hasNext()) {
   int i = itr.next();
   if (i > 5) { // filter all ints bigger than 5
      itr.remove();
   }
}

Por supuesto, puede imitar la forma de lo que hicieron Guava y Apache, introduciendo una nueva interfaz Predicado. Eso también podría ser lo que harán los desarrolladores más avanzados.

public interface Predicate<T> {
   boolean test(T o);
}
 
public static <T> void filter(Collection<T> collection, Predicate<T> predicate) {
    if ((collection != null) && (predicate != null)) {
       Iterator<T> itr = collection.iterator();
          while(itr.hasNext()) {
            T obj = itr.next();
            if (!predicate.test(obj)) {
               itr.remove();
            }
        }
    }
}

Entonces podemos usar el siguiente código para filtrar una colección:

filter(list, new Predicate<Integer>() {
    public boolean test(Integer i) { 
       return i <= 5; 
    }
});

6. ¿La forma más sencilla de convertir una lista en un conjunto?

Hay dos formas de hacerlo, dependiendo de cómo desee igual definido. El primer fragmento de código pone una lista en un HashSet. Entonces, la duplicación se identifica principalmente por código hash(). En la mayoría de los casos, funcionará. Pero si necesita especificar la forma de comparación, es mejor usar la segunda parte del código donde puede definir su propio comparador.

Set<Integer> set = new HashSet<Integer>(list);
Set<Integer> set = new TreeSet<Integer>(aComparator);
set.addAll(list);

7. ¿Cómo elimino elementos repetidos de ArrayList?

Esta pregunta está bastante relacionada con la anterior.
Si no le importa el orden de los elementos en el Lista de arreglo, una forma inteligente es poner la lista en un conjunto para eliminar la duplicación y luego volver a moverla a la lista. Aqui esta el codigo

ArrayList** list = ... // initial a list with duplicate elements
Set<Integer> set = new HashSet<Integer>(list);
list.clear();
list.addAll(set);

Si le importa el orden, el orden se puede conservar poniendo una lista en un LinkedHashSet que está en el JDK estándar.

8. Colección ordenada

Hay un par de formas de mantener una colección ordenada en Java. Todos ellos proporcionan una colección en orden natural o por el comparador especificado. Por orden natural, también necesita implementar el Comparable interfaz en los elementos.

  1. Colecciones.clasificar() puede ordenar un Lista. Como se especifica en el javadoc, este tipo es establey garantía n log (n) actuación.
  2. PriorityQueue proporciona una cola ordenada. La diferencia entre PriorityQueue y Colecciones.clasificar() es eso, PriorityQueue mantener una cola de pedidos en todo momento, pero solo puede obtener el elemento principal de la cola. No puede acceder aleatoriamente a su elemento como PriorityQueue.obtener (4).
  3. Si no hay duplicación en la colección, TreeSet es otra opción. Igual que PriorityQueue, mantiene el conjunto ordenado en todo momento. Puedes conseguir el más bajo y mas alto elementos de la TreeSet. Pero aún no puede acceder aleatoriamente a su elemento.

En un short, Colecciones.clasificar() proporciona una lista ordenada de una sola vez. PriorityQueue y TreeSet mantener colecciones ordenadas en todo momento, a costa de no tener acceso indexado a los elementos.

9. Colecciones.lista vacía() vs nueva instancia

La misma pregunta se aplica a emptyMap () y conjunto vacio().

Ambos métodos devuelven una lista vacía, pero Colecciones.lista vacía() devuelve una lista que es inmutable. Esto significa que no puede agregar nuevos elementos al «vacío«lista. En el fondo, cada llamada de Colecciones.lista vacía() en realidad, no creará una nueva instancia de una lista vacía. En su lugar, reutilizará la instancia vacía existente. Si estas familiarizado único en el patrón de diseño, debes saber a qué me refiero. Así que esto le dará un mejor rendimiento si lo llama con frecuencia.

10 Colecciones. Copiar

Hay dos formas de copiar una lista de origen en una lista de destino. Una forma es usar Lista de arreglo constructor

ArrayList<Integer> dstList = new ArrayList<Integer>(srcList);

El otro es usar Colecciones.Copiar() (como a continuación). Tenga en cuenta la primera línea, asignamos una lista al menos tan larga como la lista de origen, porque en el javadoc de Colecciones, dice La lista de destinos debe ser al menos tan larga como la lista de origen.

ArrayList<Integer> dstList = new ArrayList<Integer>(srcList.size());
Collections.copy(dstList, srcList);

Ambos métodos son poco profundo Copiar. Entonces, cual es el diferencia entre estos dos métodos?

  • Primero, Colecciones.Copiar() no reasignará la capacidad de dstList incluso si dstList no tiene suficiente espacio para contener todo srcList elementos. En cambio, lanzará un IndexOutOfBoundsException. Uno puede preguntarse si tiene algún beneficio. Una razón es que garantiza que el método se ejecute en tiempo lineal. También es adecuado cuando desea reutilizar matrices en lugar de asignar nueva memoria en el constructor de Lista de arreglo.

  • Colecciones.Copiar() solo puedo aceptar Lista como origen y destino, mientras que Lista de arreglo acepta Colección como parámetro, por lo tanto más general.

Categorías
Basics Classes & Interfaces Collections Java Top 10

Las 9 preguntas principales sobre Java Maps

En general, Mapa es una estructura de datos que consta de un conjunto de valor clave pares, y cada clave solo puede aparecer una vez en el mapa. Esta publicación resume las 9 preguntas más frecuentes sobre cómo usar Java Mapa y sus clases implementadas. En aras de la simplicidad, usaré genéricos en ejemplos. Por lo tanto, solo escribiré Map en lugar de específico Map. Pero siempre puede asumir que tanto el K y V son comparables, lo que significa K extends Comparable y V extends Comparable.


0. Convertir un mapa en una lista

En Java, Mapa La interfaz proporciona tres vistas de colección: conjunto de claves, conjunto de valores y conjunto de valores-clave. Todos ellos se pueden convertir a Lista usando un constructor o añadir todo() método. El siguiente fragmento de código muestra cómo construir un Lista de arreglo de un mapa.

// key list
List keyList = new ArrayList(map.keySet());
// value list
List valueList = new ArrayList(map.values());
// key-value list
List entryList = new ArrayList(map.entrySet());

1. Iterar sobre un mapa

La iteración sobre cada par de pares clave-valor es la operación más básica para recorrer un mapa. En Java, dicho par se almacena en la entrada del mapa llamada Entrada del mapa. Mapa.entrySet () devuelve un conjunto clave-valor, por lo tanto, la forma más eficiente de revisar cada entrada de un mapa es

for(Entry entry: map.entrySet()) {
  // get key
  K key = entry.getKey();
  // get value
  V value = entry.getValue();
}

El iterador también se puede utilizar, especialmente antes de JDK 1.5

Iterator itr = map.entrySet().iterator();
while(itr.hasNext()) {
  Entry entry = itr.next();
  // get key
  K key = entry.getKey();
  // get value
  V value = entry.getValue();
}

2. Ordenar un mapa en las claves

Ordenar un mapa en las claves es otra operación frecuente. Una forma es poner Entrada del mapa en una lista y ordenarlo usando un comparador que ordena el valor.

List list = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator() {
 
  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getKey().compareTo(e2.getKey());
  }
 
});

La otra forma es usar SortedMap, que además proporciona un orden total en sus claves. Por lo tanto, todas las claves deben implementar Comparable o ser aceptado por el comparador.

Una clase de implementación de SortedMap es TreeMap. Su constructor puede aceptar un comparador. El siguiente código muestra cómo transformar un mapa general en un mapa ordenado.

SortedMap sortedMap = new TreeMap(new Comparator() {
 
  @Override
  public int compare(K k1, K k2) {
    return k1.compareTo(k2);
  }
 
});
sortedMap.putAll(map);

3. Ordene un mapa según los valores

Poner el mapa en una lista y ordenarlo también funciona en este caso, pero necesitamos comparar Entrada.getValue () esta vez. El siguiente código es casi el mismo que antes.

List list = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator() {
 
  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getValue().compareTo(e2.getValue());
  }
 
});

Todavía podemos usar un mapa ordenado para esta pregunta, pero solo si los valores también son únicos. Bajo tal condición, puede invertir el par clave = valor a valor = clave. Esta solución tiene una limitación muy fuerte, por lo tanto, no la recomiendo realmente.

4. Inicialice un mapa estático / inmutable

Cuando espera que un mapa permanezca constante, es una buena práctica copiarlo en un mapa inmutable. Estas técnicas de programación defensiva le ayudarán a crear mapas de subprocesos no solo seguros para su uso, sino también seguros.

Para inicializar un mapa estático / inmutable, podemos usar un inicializador estático (como a continuación). El problema de este código es que, aunque mapa se declara como final estática, todavía podemos operarlo después de la inicialización, como Test.map.put(3,"three");. Por tanto, no es realmente inmutable. Para crear un mapa inmutable usando un inicializador estático, necesitamos una clase anónima adicional y la copiamos en un mapa no modificable en el último paso de la inicialización. Consulte la segunda parte del código. Entonces, un UnsupportedOperationException será arrojado si corres Test.map.put(3,"three");.

public class Test {
 
  private static final Map map;
  static {
    map = new HashMap();
    map.put(1, "one");
    map.put(2, "two");
  }
}
public class Test {
 
  private static final Map map;
  static {
    Map aMap = new HashMap();
    aMap.put(1, "one");
    aMap.put(2, "two");
    map = Collections.unmodifiableMap(aMap);
  }
}

Guayaba las bibliotecas también admiten diferentes formas de intilizar una colección estática e inmutable. Para obtener más información sobre los beneficios de las utilidades de recolección inmutables de Guava, consulte Colecciones inmutables explicadas en la guía del usuario de Guava.

5. Diferencia entre HashMap, TreeMap y Hashtable

Hay tres implementaciones principales de Mapa interfaz en Java: HashMap, TreeMap, y Tabla de picadillo. Las diferencias más importantes incluyen:

  1. El orden de iteración. HashMap y Tabla de picadillo no garantice el orden del mapa; en particular, no garantizan que el pedido se mantenga constante en el tiempo. Pero TreeMap iterará todas las entradas según el «orden natural» de las claves o mediante un comparador.
  2. valor clave permiso. HashMap permite nulo clave y nulo valores (solo se permite una clave nula porque no se permiten dos claves iguales). Tabla de picadillo no permite nulo clave o nulo valores. Si TreeMap utiliza ordenamiento natural o su comparador no permite nulo claves, se lanzará una excepción.
  3. Sincronizado. Solo Tabla de picadillo está sincronizado, otros no. Por lo tanto, «si no se necesita una implementación segura para subprocesos, se recomienda utilizar HashMap en lugar de Tabla de picadillo. «

Una comparación más completa es

                 | HashMap | Hashtable | TreeMap
-------------------------------------------------------
iteration order  | no      | no        | yes
null key-value   | yes-yes | no-no   | no-yes
synchronized     | no      | yes       | no
time performance | O(1)    | O(1)      | O(log n)
implementation   | buckets | buckets   | red-black tree

Lea más sobre HashMap frente a TreeMap frente a Hashtable frente a LinkedHashMap.

6. Un mapa con vista / búsqueda inversa

A veces, necesitamos un conjunto de pares clave-clave, lo que significa que los valores del mapa son únicos, así como las claves (mapa uno a uno). Esta restricción permite crear una «vista / búsqueda inversa» de un mapa. Entonces podemos buscar una clave por su valor. Tal estructura de datos se llama mapa bidireccional, que lamentablemente no es compatible con JDK.

Tanto Apache Common Collections como Guava proporcionan la implementación de un mapa bidireccional, llamado BidiMap y BiMap, respectivamente. Ambos aplican la restricción de que existe una relación 1: 1 entre claves y valores.

7. Copia superficial de un mapa

La mayor parte de la implementación de un mapa en Java, si no todas, proporciona un constructor de copia de otro mapa. Pero el procedimiento de copia es no sincronizado. Eso significa que cuando un hilo copia un mapa, otro puede modificarlo estructuralmente. Para[evitarunacopiaaccidentalnosincronizadasedebeusar[preventaccidentalunsynchronizedcopyoneshoulduseColecciones.SynchronizedMap () por adelantado.

Map copiedMap = Collections.synchronizedMap(map);

Otra forma interesante de copia superficial es mediante el uso de clon() método. sin embargo lo és NO incluso recomendado por el diseñador del marco de la colección de Java, Josh Bloch. En una conversación sobre «Copiar constructor versus clonación«, él dijo

A menudo proporciono un método de clonación pública en clases concretas porque la gente lo espera. … Es una pena que Cloneable esté roto, pero sucede. … Cloneable es un punto débil, y creo que la gente debería ser consciente de sus limitaciones.

Por esta razón, ni siquiera te diré cómo usar clon() método para copiar un mapa.

8. Crea un mapa vacío

Si el mapa es inmutable, use

map = Collections.emptyMap();

De lo contrario, use cualquier implementación. Por ejemplo

map = new HashMap();

EL FIN

Categorías
C/C++ Top 10

Las 5 preguntas principales sobre punteros C / C ++

Este artículo resume las principales preguntas formuladas sobre los punteros de C / C ++ en stackoverflow.com. Los punteros son la parte más confusa de C / C ++, esas preguntas utilizan ejemplos simples para explicar conceptos clave de punteros.

1. Cuente de 1 a 1000 sin usar bucles

#include <stdio.h>
#include <stdlib.h>
 
void main(int j) {
  printf("%dn", j);
  (&main + (&exit - &main)*(j/1000))(j+1);
}

El único otro método para contar del 1 al 1000 es la recursividad. Según el lenguaje C, j tiene ‘1’ como su valor al principio. Cuando 1 <= j <1000, & main + (& exit - & main) * (j / 1000) siempre se evalúa como & main, que es la dirección de memoria de main. (& main) (j + 1) es la siguiente iteración que queremos obtener, que imprimiría '2' en la pantalla, etc. La condición de parada de esta recursividad es que cuando j llega a 1000, & main + (& exit - & main) * (j / 1000) evalúa a & exit, que saldrá elegantemente de este proceso y tiene el código de error 1001 devuelto al sistema operativo.

2. ¿Por qué un[5] == 5[a]?

a[b] significa * (a + b) según el estándar C. a es la dirección base, b es un desplazamiento a partir de a. a[b] es el valor en la dirección de a + b.

Por tanto, a + 5 y 5 + a es la misma dirección de memoria. Su valor * (a + 5) y * (5 + a) es el mismo. Entonces un[5] == 5[a]

3. ¿Cuántos niveles de punteros podemos tener?

Tanto como un humano pueda manejar. Cualquier compilador de c / c ++ definitivamente admite más que eso.

4. C puntero a matriz / matriz de desambiguación de punteros

¿Cuál es la diferencia entre las siguientes declaraciones?

int* arr1[8];
int (*arr2)[8];
int *(arr3[8]);

Por tabla de precedencia C, matriz [], la función return () tiene mayor prioridad sobre el puntero *.

Para int * arr1[8]
arr1 ante todo es una matriz sin importar el tipo de elemento. Después de aplicar el puntero *, sabemos que arr1 es una matriz de punteros int.

Para int (* arr2)[8]
Por regla de anulación de corchetes, el puntero * tiene mayor prioridad sobre la matriz [] en este caso. Entonces arr2 es ante todo un puntero sin importar a qué esté apuntando. Después de aplicar la matriz [], sabemos que arr2 es un puntero a una matriz de int.

Para int * (arr3[8])
El corchete en este caso no cambia ninguna precedencia predeterminada, por lo que es lo mismo que int * arr1[8]

5. ¿Qué sentido tienen los punteros constantes?

(1) void foo (int * const ptr);
(2) void foo (int * ptr);

Para el llamador de foo, el valor de ptr se copia en foo tanto en (1) como en (2).

(1) y (2) marcan la diferencia solo para el implementador de foo, no para el cliente de foo.

En (2), el implementador puede cambiar accidentalmente el valor de ptr, lo que potencialmente puede introducir errores.

(1) es como el implementador le dice al compilador antes de escribir el cuerpo de foo, «oye, no quiero valorar ptr, si se cambia de alguna manera oscura, haz que la compilación falle, déjame verificar eso»