|
651
|
Programación / Java / Re: pequeñas dudas de java
|
en: 4 Abril 2019, 10:58 am
|
Hola chicos, como puedo aprender mas rapido Java? que quiere decir cuando creo un metodo dentro de una clase principal como public static void me lo toma cuando lo llamo desde el main de esa clase pero cuando lo declaro como public void no me lo toma?
Leete un buen libro como deitel, saber buscar en Google,aprende bien lo básico pero bien. Aquí coloque varios libros en Manuela de Java de Java
Y con respecto a los métodos estaticos y de objetos pues, es que ambos funcionan distinto. en el main puedes invocar a métodos estaticos, y los metodos no estaticos por medio de una Objeto creado que pueda invocar a su método correspondiente.
Y eso se da porque el metodo main es estatico en si.
Cosa distinta en un contructor, que puedes invocar sin mucho problema, muchos frameworks no tienen como entrypoint a el metodo main, sino que usan otros, y tambien contructores 
|
|
|
652
|
Programación / Java / Re: Juego de la vida - Simulacion en Java
|
en: 1 Abril 2019, 01:10 am
|
Puedes hacerlo de modo procedimental o con clases, a tu gusto... Si lo haces con clases, por ejemplo crearía una clase 'tablero', en el constructor se recibe las filas y columnas (o cantidad) si ambos valores serán iguales. También un parámetro para indicar cuandos e considera el mundo muerto, es decir si hay 25x25 casillas (625 células, podría consdierarse muerto (por ejemplo), si quedna menos de 50), un valor de cero o menor, podría indicar que vive mientras queden células vivas... Acto seguido se crea un array bidimensional de NxM casillas... int Filas, Columnas, MundoMuere
funcion New(int F, int C, int MM) filas = f columnas = C Si (MM < 0) luego MM=0) MundoMuere = MM
dimensionar Mapa(filas, columnas) fin funcion
ó: funcion New(int Casillas) Una enumeración de 2-3 estados. Celula viva = '*' , célula muerta = ' ', celula 'enferma' = '-' (caso de que quisieras complicarlo y que una célula necesitara x estados (por ejemplo 1, y al siguiente muere) seguidos de transición por debajo del umbral de vida). es decir si no tiene los vecinos esperados y está viva, enferma, pero si está enferma muere. enumeración EstadoCelula ESTADO_VIVA = 0 ESTADO_ENFERMA = 1 ' de 1 a 8, podría alojar 8 transiciones antes de morir, o pasar directamente del 1 al 9, o del 0 al 9 ESTADO_MUERTA = 9 FIN ENUMERACION Un array con los valores a dibujar (char/string) char representa(0 a 9) // con estos valores representa(0) = "*" // viva representa(1) = "-" //enferma // representa(2) = "-" //... si se prefieriese dibujar estados de enfermedad diferentes o todos con '1' representa(9) = " " //muerta
// tambén se puede hacer otro array con colores, para dibujar de diferente color vivas de 'enfermas'. Otra enumeración de los valores de transicion: (Tu pon los valores que quieras, de hecho es bueno modificarlos, para ver como se comporta). enumeracion Transicion TR_MUERE_INANICION = 1 // con 3 o menos células muere. // TR_VIVE = 2,3,4,5,6 / se entiende que viven con el rango dentro de ambos extremos. TR_MUERE_SOBREPOBLACION = 7 fin enumeracion Una estructura retiene el estadO (de esos valores enumerados) y el recuento de vecinos. Estructura DatosDeCelula EstadoCelula Estado Transicion NumVecinos fin estructura
Array de DatosDeCelula Mapa()
Una función se encarga de contar los vecinos, para cada célula: Funcion ContarVecinos() int i, j, k, n
bucle para j desde 0 a filas-1 bucle para k desde 0 a Columnas -1 Mapa(j,k).Vecinos = ContarMisVecinos(j,k) siguiente siguiente fin funcion
// contar los vecinos para esta célula... Transicion = funcion ContarMisVecinos(int fila, int Columna) int x, y, w, h int j, k Transicion vecinos
Si (fila <2) // tiene 1 o 0 vecinos a la izquierda x = 0 w = fila + 2 Si (fila > filas-3) // tiene 1 ó 0 vecinos a la derecha x= fila - 2 w = filas -1 sino x= fila - 2 w = fila + 2 fin si
Si (columna <2) // tiene 1 o 0 vecinos arriba y = 0 h = columna + 2 Si (columna > Columnas-3) // tiene 1 ó 0 vecinos abajo y = columna - 2 h = columnas -1 sino y = columna - 2 h = columna + 2 fin si
bucle para j desde y hasta h bucle para k desde x hasta w Si (mapa(j,k).estado = ESTADO_VIVA ) luego vecinos +=1 siguiente siguiente
devolver vecinos fin funcion
Luego otra función que actualice el estado en base a sus vecinos: funcion UpdateMapa int j, k, vivas
bucle para j desde 0 a filas -1 bucle para k desde 0 hasta columnas -1 si (Mapa(j,k).vecinos <= TR_MUERE_INANICION) o si (Mapa(j,k).vecinos <= TR_MUERE_SOBREPOBLACION) // es una sola línea con la anterior, queda cortada en 2 por ser larga... mapa(j,k).estado = ESTADO_MUERTA si no // hay que señalarla viva, porque antes podría estar muerta mapa(j,k).estado = ESTADO_VIVA vivas +=1 fin si
// char que representa el estado, fila, columna, color Dibujar(representa(mapa(j,k).estado ) ,j, k , color) siguiente siguiente
Si (vivas <= MundoMuere) luego finpartida // no quedan células suficientes... fin si fin funcion Y una función dibujar para dibujar cada casilla (si no es muy complejo lo que deba hacer, puede subsumirse en la función anterior... (en 'dibujar...'). Básicamente eso es lo principal, generar las células al azar al comienzo de la partida, y algún otro detalle resulta ya nimio... p.d.: Se me olvidada... al contar los vecinos, debe descontarse 1, si la célula en cuestión esta 'viva' (ella no debe contarse como su vecina). Es más fácil el doble bucle sin considerarla y luego descontarla que filtrarlo en el propio bucle (pués sucede 1 de las hasta 9 veces por cada casilla). Interesante respuesta doc, vere si tengo un tiempo para mudarlo a Java 
|
|
|
653
|
Programación / Java / Re: Suma de dos matrices - Me devuelve "[[D@7d4991ad"
|
en: 1 Abril 2019, 00:30 am
|
Casi casi lo tiene dog , recorrer con doble ciclo for como haces con el método suma, porque debes recorrer cada indice, me da aburrimiento máximo llenarla, pero aleatoria nom y así ahorras tiempo en desarrollo, no apto para produccion Pero me imagino que entiendes no? ejemplo las coordenada [0,0] de la matris1 se sumara con la [0,0] de la matris 2 y asipublic class Bidimensional { private double[][] matriz; private int renglones; private int columnas; public Bidimensional(int renglones, int columnas) { // constructor y pido el ingreso de valores a matrices Scanner entrada = new Scanner (System. in); this.matriz = new double [renglones][columnas]; for(int i=0 ; i<renglones; i++) { for(int j=0; j<columnas; j++) { matriz [i ][j ]= Double. valueOf(TWO_DIGITS. format(1 + SR. nextDouble())); System. out. print("Ingresar el numero de matriz ["+i +":"+j +"]: "); System. out. println(matriz [i ][j ]); } } } public double[][] suma(Bidimensional m2) // operacion de suma { for(int i=0; i<2; i++) { for(int j=0; j<2; j++) { matriz[i][j]= matriz[i][j] + m2.matriz[i][j]; } } return matriz; } public double format(final double num) { return Double. valueOf(TWO_DIGITS. format(num ). replace(",", ".")); } public static void main (String ... blalba) { final Bidimensional matris = new Bidimensional(2,2); final Bidimensional matris2 = new Bidimensional(2,2); final double[][] resultado = matris.suma(matris2); //Recorrer el Array de doble dimension, con java 8, java 7 usa doble for . flatMapToDouble(Arrays::stream ) .map(this::format) . forEach(System. out::println ); } }
Ingresar el numero de matriz [0:0]: 1.32 Ingresar el numero de matriz [0:1]: 1.8 Ingresar el numero de matriz [1:0]: 1.62 Ingresar el numero de matriz [1:1]: 1.71 Ingresar el numero de matriz [0:0]: 1.53 Ingresar el numero de matriz [0:1]: 1.6 Ingresar el numero de matriz [1:0]: 1.6 Ingresar el numero de matriz [1:1]: 1.57 2.85 3.4 3.22 3.28 Process finished with exit code 0
Tambien te sirve asi, y cualquier otra manera que funcione XD public double[][] suma(Bidimensional m2) // operacion de suma { for(int i=0; i<matriz.length; i++) { for(int j=0; j<m2.matriz[i].length; j++) { matriz[i][j]= matriz[i][j] + m2.matriz[i][j]; } } return matriz; }
Y asi
for(int i=0; i<matriz.length; i++) { for(int j=0; j<matriz[i].length; j++) { matriz[i][j]= matriz[i][j] + m2.matriz[i][j]; } }
|
|
|
654
|
Programación / Java / Re: Metodo mostrar todos los atributos de un objeto por pantalla(RESUELTO)
|
en: 30 Marzo 2019, 18:37 pm
|
No deberias gastar tiempo en escribir los getters / setters o el metodo toString(). Los editores deberian hacerlo por ti. IntelliJ lo hace, al menos.
Otra alternativa es ni siquiera escribir el codigo, sino anotar la clase y que magicamente esos metodos se escriban y existan aunque no los veas. AutoValue y Lombok son 2 exponentes de esto.
Magicamente? o gracias a Reflection vía anotaciones? generando codigo en runtime, la chavala esta aprendiendo, por eso mi ejemplo.
Aunque me falto decirle eso. yo genere getters/setters/toString() con intelliJIDea, eclipse también lo hace, netBeans me imagino que también debería.
@CalgaryCorpus seria bueno que le pusieras un ejemplo de Project Lombok para que la ayudes.
Y de paso ah dia de hoy grandes Frameworks webs de java, potentes, tienen su implementacion de toString() sin api de terceros como lombok entre otras, de paso que toString() sirve para no mostrar el codigo hash directamente a alguien que espie dichos objetos. @Beginner Web , creas las variables de instancia que quieras, luego, teclas Alt + insertar, debería aparecerte este cuadro de contexto con las opciones que se muestran, no aparece toString() porque ya lo use, versión de NetBeans que tengo
* Product Version: NetBeans IDE 8.2 (Build 201610071157)
|
|
|
655
|
Programación / Java / Re: Metodo mostrar todos los atributos de un objeto por pantalla(RESUELTO)
|
en: 30 Marzo 2019, 14:50 pm
|
//Este es una clase public class Persona{ private String nombre; private int edad;
Constructor va aquí Getters & Setters aquí }
//Este es el main public class Personal{
public static void main(){ Persona objeto1=new Persona("Ana",14);
//Esto es algo tedioso de hacer varios objetos de distintas clases //Podia crear un metodo en la clase Persona que muestre todo, pero quiero saber si hay otra técnica por defecto sout para mostrar el nombre de objeto1; sout para mostrar la edad de objeto1;
}
}
Me parece que me conviene crear metodos en las clases para pedir los datos y otro para mostrarlos asi escribo menos en el main
Que tal chavalina? Usa GeshiSi hay mejores maneras de hacerlo por ejemplo una, lo que necesitas es algo de herencia simpleimport java.util.logging.Logger; /** * */ @FunctionalInterface public interface IPersonal { Logger LOGGER =Logger.getLogger(IPersonal.class.getSimpleName()); void introducirDatos(); default <T> void mostrar(final T value) { } /** * usar dentro de un metodo estatico * @param value * @param <T> */ static <T> void mostrar2(final T value) { } default <T> void log(final T t) { LOGGER.severe(t.toString()); } /** * usar dentro de un metodo estatico * @param t * @param <T> */ static <T> void log2(final T t) { LOGGER.severe(t.toString()); } }
import java.util.Objects; import java.util.Scanner; /** * */ public abstract class AbstractBasePersona implements IPersonal { protected int edad; protected static final Scanner LEER = new Scanner (System. in); public AbstractBasePersona() { this.edad = 0; this.nombre = ""; } public AbstractBasePersona (final String nombre, final int edad ) { this.nombre = Objects.requireNonNull(nombre,"Nombre no debe ser null"); this.edad = Objects.requireNonNull(edad,"Edad no debe ser null"); } return nombre; } public void setNombre (String nombre ) { this.nombre = nombre; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } @Override public void introducirDatos() { mostrar("Introduce nombre: "); nombre = LEER.next(); //bug scanner LEER.nextLine(); mostrar("Introduce edad"); while(!LEER.hasNextInt()) { LEER.next(); mostrar("Valor invalido!, solo numeros"); } edad = LEER.nextInt(); } @Override final StringBuilder sb = new StringBuilder("\nPersona"); sb.append("\nNombre: ").append(nombre).append("\n"); sb.append("Edad: ").append(edad); return sb.toString(); } }
public class PersonalDeInformatica extends AbstractBasePersona { private boolean esDeInformatica; public PersonalDeInformatica() { super(); } public PersonalDeInformatica (final String nombre, final int edad, boolean esDeInformatica ) { super(nombre,edad); this.esDeInformatica = esDeInformatica; } @Override public void introducirDatos() { /** * Introducir los datos basicos por defecto, Nombre y Edad */ super.introducirDatos(); // pedimo si es personal de informatica mostrar("Personal del Informtica ?"); esDeInformatica = LEER.nextBoolean(); //setemos el tipo de persona setEsDeInformatica(esDeInformatica); } public boolean isEsDeInformatica() { return esDeInformatica; } public void setEsDeInformatica(boolean esDeInformatica) { this.esDeInformatica = esDeInformatica; } @Override final StringBuilder sb = new StringBuilder(); sb.append(super.toString()); sb.append("\nEs de informatica ? ").append(esDeInformatica); return sb.toString(); } }
/** * */ public class PersonalDeLimpieza extends AbstractBasePersona { private boolean esDeLimpieza; //por defecto la variable de instancia boolean, es false public PersonalDeLimpieza() { super(); } public PersonalDeLimpieza (final String nombre, final int edad, final boolean esDeLimpieza ) { super(nombre,edad); this.esDeLimpieza = esDeLimpieza; } public boolean isEsDeLimpieza() { return esDeLimpieza; } public void setEsDeLimpieza(boolean esDeLimpieza) { this.esDeLimpieza = esDeLimpieza; } @Override public void introducirDatos() { //invocamo al introducir datos de la superClaseAbstracta super.introducirDatos(); // pedimo si es personal de limpieza mostrar("Personal del limpieza ?"); esDeLimpieza = LEER.nextBoolean(); //setemos el tipo de persona setEsDeLimpieza(esDeLimpieza); } @Override final StringBuilder sb = new StringBuilder(); sb.append(super.toString()); sb.append("\nPersonal de Limpieza ? ").append(isEsDeLimpieza()).append("\n"); return sb.toString(); } }
import java.util.LinkedList; /** * */ private final LinkedList<IPersonal> iPersonalLinkedList = new LinkedList<>(); init(); } private void init() { final PersonalDeLimpieza personalDeLimpieza = new PersonalDeLimpieza(); personalDeLimpieza.introducirDatos(); final PersonalDeInformatica personalDeInformatica = new PersonalDeInformatica(); personalDeInformatica.introducirDatos(); /** * Anadimos a todos los objetos que extienden/implementan a IPersonal * para procesarlos de manera polimorfica gracias, a que cada uno, * sobreEscribe a toString(). */ iPersonalLinkedList.add(personalDeLimpieza); iPersonalLinkedList.add(personalDeInformatica); /** * Se invocara al metodo toString() de cada Objeto, implicitanmente */ //java 8 iPersonalLinkedList.forEach(e -> e.mostrar(e)); //java 7 /*for(IPersonal tmp : iPersonalLinkedList) { tmp.mostrar(tmp.toString()); }*/ } public static void main (String ... blabla) { } }
Salida Introduce nombre: Ana Introduce edad 14 Personal del limpieza ? false Introduce nombre: rubn Introduce edad 30 Personal del Informtica ? true Persona Nombre: Ana Edad: 14 Personal de Limpieza ? false Persona Nombre: rubn Edad: 30 Es de informatica ? true Process finished with exit code 0
Un ejemplo sencillo, luego chekeate el patrón Builder , y Abstract Generic Builder , con interfaces también (te aseguro que te gustara, y trabajaras mejor con inmutabilidad)
|
|
|
656
|
Seguridad Informática / Seguridad / Re: localizar celular por imei
|
en: 30 Marzo 2019, 14:38 pm
|
me robaron mi celular lo puedo encontrar mediante mi imei
Anda donde tu operador, y reportalo como robado, pero quizás ese maleante o X, pueda reparar ese imei y pueda usarlo siendo mas fácil en Android, en IOs tendría que cambiar la nandFlash donde esta la configuración del imei, pero no lo creo de verdad.
|
|
|
658
|
Programación / Java / Re: Clase Lista
|
en: 28 Marzo 2019, 17:37 pm
|
Seguro? no te faltó algo a la hora de declarar la lista de Persona?  estoy 90% seguro que no probaste el ejemplo, o no hiciste el import bien, que este último no lo creo.
Y eso que lo escribo desde mi Android .
El operador diamante puede ir vacío también, como con el objeto en el, pero siendo redundante, o sea, final LinkedList<Persona> lista = new LinkedList<Persona>(); // redundante
|
|
|
659
|
Programación / Java / Re: Clase Lista
|
en: 28 Marzo 2019, 07:07 am
|
Hola tengo una duda como hago para crear una LinkedList(); de objetos?
Crea tu javabean primero , la típica clase con setters y getters, y luego usas el método add() de la list  final LinkedList<Persona> list = new LinkedList<>(); list.add(new Persona("Beginner","web",14));
El Bean persona con 3 atributos, 2 String , y un int o Integer, faltarían los setters y getters para acceder a dichos atributos, ojo los setters quitan inmutabilidad a un objeto haciendo que no sean aptos para un ambiente de concurrencia, si es inmutable tu bean, o sea: * Clase con final (public final class Persona) para que no se pueda heredar. * Sin setters * Variables de instancia con final - y puedes añadir por comodidad una clase estática dentro Aka Builder/AbstractoGenerico para inicializar sus variables de instancia pues mucho mejor, ya que este te creará una copia mutable de Persona con la que puedes trabajar.
|
|
|
660
|
Programación / Java / Re: Evitar duplicados en Jtable
|
en: 25 Marzo 2019, 00:16 am
|
Buenas noches,
Necesito ayuda con mi proyecto en Java lo tengo prácticamente finalizado pero esto es lo único que me tiene estancado,
Quiero evitar duplicados de la columna código de cliente de un Jtable, al darle clic al botón "Guardar", evalué si no hay código con ese valor lo guarde en la tabla si ya existe este código muestre la excepción que "Código del cliente ya existe" y no guarde.
Les agradecería su ayuda,
Saludos.
Si se puede pero muestra algo de código a ver como la tienes?...  package foro; import javax.swing.*; import javax.swing.border.TitledBorder; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.util.ArrayList; import java.util.List; /** * @Autor rub´n y google */ public class JTableAvoidDuplicados extends JFrame { public JTableAvoidDuplicados() { init(); setSize(500, 100); pack(); setLocationRelativeTo(null); setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE); setVisible(true); } private void init() { add(panelNorte); } titledBorder. setTitleFont(new Font(Font. SANS_SERIF, Font. BOLD, 16)); panel.setBorder(titledBorder); /** * Filas de la table */ defaultTableModel.addColumn("Codigo"); defaultTableModel. addRow(new Object[]{"codigo-0000"}); defaultTableModel. addRow(new Object[]{"codigo-0001"}); defaultTableModel. addRow(new Object[]{"codigo-0002"}); defaultTableModel. addRow(new Object[]{"codigo-0003"}); return panel; } panelSur. setBorder(BorderFactory. createEmptyBorder(10, 0, 5, 0)); panelSur. add(new JLabel("Introduce codigo: ")); panelSur. add(Box. createHorizontalStrut(10)); panelSur.add(textField); panelSur. add(Box. createHorizontalStrut(10)); panelSur.add(button); initBehaviour(); return panelSur; } private void initBehaviour() { button.addActionListener(e -> tabla(table, textField)); } boolean exists = false; for (int i = 0; i < tabla.getRowCount(); i++) { s = tabla.getValueAt(i, 0).toString().trim(); if (jTextField.getText().equals("")) { JOptionPane. showMessageDialog(null, "Introduce un valor"); break; } else if (jTextField.getText().equals(s)) { exists = true; break; } } if (!exists) { final List<String> lista = new ArrayList<>(); final String codigo = jTextField. getText(); if (!codigo.equals("")) { lista.add(jTextField.getText()); dd.addRow(lista.toArray()); } } else { JOptionPane. showMessageDialog(null, "Codigo existente."); } } public static void main (String... gaga) { try { ex.printStackTrace(); } new Thread(JTableAvoidDuplicados ::new). start(); } }

|
|
|
|
|
|
|