Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Primeros pasos con Java\n",
"**Autor**: Daniel Mateos-García\n",
"\n",
"**version 1.0.1**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"| |\n",
"|:---|\n",
"**MUY IMPORTANTE:** Antes de empezar este Notebook, debes haber trabajado el bloque 1 de los apuntes de teoría disponibles en la plataforma de enseñanza virtual. Sin este requisito, problablemente entenderás muy poco de lo que se detalla a continuación.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La intención de este Notebook es la de familiarizarnos un poco con la sintaxis de Java. Para ello vamos a empezar definiendo un tipo nuevo:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"import java.util.stream.Collectors;\n",
"\n",
"public class Punto{\n",
" \n",
" //Atributos\n",
" private Double x;\n",
" private Double y;\n",
" \n",
" //Método constructor\n",
" public Punto(Double x, Double y){\n",
" this.x=x;\n",
" this.y=y;\n",
" }\n",
" \n",
" //getters o métodos consultores (u observadores)\n",
" public Double getX(){\n",
" return x;\n",
" }\n",
" public Double getY(){\n",
" return y;\n",
" }\n",
" \n",
" //setters o métodos modificadores\n",
" public void setX(Double x) {\n",
" this.x = x;\n",
" }\n",
"\n",
" public void setY(Double y) {\n",
" this.y = y;\n",
" }\n",
" \n",
" //Método que realiza el cálculo de la distancia entre dos puntos\n",
" public Double getDistanciaAOtroPunto(Punto p) {\n",
" Double dx = this.getX() - p.getX();\n",
" Double dy = this.getY() - p.getY();\n",
" return Math.sqrt(dx * dx + dy * dy);\n",
" }\n",
" \n",
" //Método que devuelve la representación como cadena de un Punto\n",
" public String toString(){\n",
" return \"Punto [x=\" + x + \", y=\" + y + \"]\";\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Algunas consideraciones sobre el diseño del tipo *Punto*. \n",
"\n",
"La palabra reservada *public* permite que la clase y los métodos sean accesibles desde fuera de la propia clase. Es decir, nos posibilita crear objetos de tipo *Punto* (*Punto p=new (...)*) y acceder a sus operaciones (*p.getX()*). La palabra *private* hace justo lo contrario. En nuestro caso, impide que los atributos sean accesibles desde fuera de la clase (dado un objeto *p* de tipo *Punto*, no podríamos hacer algo como *p.x=10.0*)\n",
"\n",
"Fíjate que el método constructor no lleva ningún parámetro de salida y que toma el nombre del tipo.\n",
"Fíjate también en la palabra reservada *this*. En el caso de los *getters* y *setters* nos es útil para poder diferenciar la *x* atributo de la *x* parámetro (igual pasa con la *y*). De esta forma, cuando la escribimos seguida de un punto (*this.*) tendremos acceso a todos los atributos y métodos que se hayan definido dentro de la clase. Por tanto, **this.x** significa que estamos acciendo al **atributo x** del tipo *Punto*.\n",
"\n",
"Una vez que hemos definido un tipo nuevo, ya podemos utilizarlo como cualquier otro que venga incluido en la librería estándar. Es decir, una vez que hemos creado un tipo nuevo que se llama *Punto*, ya podemos crear objetos con él. Recuerda que para crear un objeto debes usar la palabra reservada *new* seguida del método constructor. \n",
"\n",
"**Ejercicio 1. Crea tres puntos y llámalos A, B y C respectivamente. Muéstralos por pantalla**\n",
"\n",
"Para mostrar un objeto por pantalla, puedes usar *System.out.println(objeto)*. Fíjate que lo que sale por pantalla es lo que se haya definido dentro del método *toString()*"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Punto [x=1.0, y=2.0]\n",
"Punto [x=2.0, y=3.0]\n",
"Punto [x=3.0, y=4.0]\n"
]
}
],
"source": [
"Punto A=new Punto(1.,2.);\n",
"Punto B=new Punto(2.,3.);\n",
"Punto C=new Punto(3.,4.);\n",
"\n",
"System.out.println(A);\n",
"System.out.println(B);\n",
"System.out.println(C);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ejercicio 2. Calcula el promedio de las abcisas de los puntos A, B y C**"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"promedio de las abcisas:\n",
"2.0\n"
]
}
],
"source": [
"System.out.println(\"promedio de las abcisas:\");\n",
"System.out.println((A.getX()+B.getX()+C.getX())/3);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ejercicio 3. Calcula la distancia de A a B**"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Distancia de A a B\n",
"1.4142135623730951\n"
]
}
],
"source": [
"System.out.println(\"Distancia de A a B\");\n",
"System.out.println(A.getDistanciaAOtroPunto(B));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ejercicio 4. Fijándote en el tipo Punto, construye un tipo Circulo pero sin métodos modificadores. Para implementar un tipo que represente un círculo necesitarás un punto (para el centro) y el radio**"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"public class Circulo {\n",
" private Punto centro;\n",
" private Double radio;\n",
"\n",
" public Circulo(Punto centro, Double radio) {\n",
" this.centro = centro;\n",
" this.radio = radio;\n",
" }\n",
"\n",
" public Punto getCentro() {\n",
" return centro;\n",
" }\n",
" \n",
" public Double getRadio() {\n",
" return radio;\n",
" }\n",
"\n",
" public String toString() {\n",
" return \"Circulo [centro=\" + centro + \", radio=\" + radio + \"]\";\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ejercicio 5. Crea un círculo a partir de cualquiera de los puntos anteriores**"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Circulo [centro=Punto [x=1.0, y=2.0], radio=2.5]\r\n"
]
}
],
"source": [
"Circulo circulo=new Circulo(A, 2.5);\n",
"System.out.println(circulo);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ejercicio 6. A pesar de que el tipo creado no tiene setters, ¿se te ocurre alguna forma de cambiar el valor del centro del círculo?**"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Circulo [centro=Punto [x=0.0, y=2.0], radio=2.5]\r\n"
]
}
],
"source": [
"circulo.getCentro().setX(0.0);\n",
"System.out.println(circulo);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ejercicio 7. Piensa en cómo podrías dotar al tipo Circulo de inmutabilidad**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ejercicio 8. Calcula el área del círculo. Crea una constante con el valor de P**I"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Área del círculo\n",
"19.635\n"
]
}
],
"source": [
"final Double PI=3.1416;\n",
"System.out.println(\"Área del círculo\");\n",
"System.out.println(PI*circulo.getRadio()*circulo.getRadio());"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ejercicio 9. Escribe un método estático que determine si un punto p está dentro de un circulo c y pruébalo**\n",
"\n",
"Recuerda que para implementar un método estático debes anteponer al tipo de salida la palabra reservada *static*"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"true\r\n"
]
}
],
"source": [
"public static Boolean puntoEnCirculo(Punto p, Circulo c) {\n",
" Double d=p.getDistanciaAOtroPunto(c.getCentro());\n",
" if(d<c.getRadio()) {\n",
" return true;\n",
" }else {\n",
" return false;\n",
" }\n",
"}\n",
"System.out.println(puntoEnCirculo(B, circulo));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Ejercicio 10. Intenta hacer un snippet que agregue a una lista 100 puntos generados de forma aleatoria**\n",
"\n",
"+ Para crear una lista vacía de puntos, usa la siguiente línea: `List<Punto> lista=new ArrayList<>();`\n",
"\n",
"+ Para escribir un bloque iterativo *for* de 100 iteraciones usa:\n",
"```\n",
"for(int i=0; i<100; i++){\n",
" ...\n",
"}\n",
"```\n",
"+ Para generar un número aleatorio entre 0.0 y 10.0 (excluido) usa: `Math.random()*10`\n",
"+ Para agregar un elmento a la lista usa el método `add(...)`\n"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[Punto [x=5.485313302674654, y=8.909723988374063], Punto [x=1.5777181562142195, y=8.325541579912732], Punto [x=2.6852347412699764, y=7.015275730521826], Punto [x=2.519201623296662, y=5.08574094208969], Punto [x=9.762824905419786, y=4.726800929997376], Punto [x=9.518044752762187, y=3.0407486124278593], Punto [x=1.6285134389787703, y=5.651832113410318], Punto [x=1.533062745542082, y=5.006778391574704], Punto [x=1.0624984976271834, y=3.575723415213666], Punto [x=2.2578770736597598, y=0.24435646400302047], Punto [x=4.214121267056026, y=5.171464404130282], Punto [x=3.6486701207280605, y=2.7968012555067077], Punto [x=4.52684943903161, y=6.953963680010923], Punto [x=0.9660778811062631, y=5.009606125774423], Punto [x=3.768370691352324, y=7.358015064675715], Punto [x=2.429671385124439, y=3.5991945609708917], Punto [x=7.136321317309209, y=0.3757976101575511], Punto [x=5.030742781458728, y=7.6024054584760625], Punto [x=0.5136802741634194, y=8.05890290796453], Punto [x=4.308876698653679, y=9.813461832292528], Punto [x=1.863882768295414, y=5.371520958859211], Punto [x=9.970052818029853, y=5.903061931738232], Punto [x=5.484220264740438, y=2.3755624162481057], Punto [x=1.1087921158329628, y=8.314625686322616], Punto [x=7.377108613824489, y=5.535126803751293], Punto [x=4.494126675451535, y=5.2456174100571875], Punto [x=2.3523220824962596, y=2.04687670747999], Punto [x=6.888932986203361, y=8.547260782885745], Punto [x=8.63930965480656, y=8.534509107040193], Punto [x=7.694439561994971, y=8.213845947007508], Punto [x=3.7672180608071812, y=8.18966493426399], Punto [x=1.346484990804122, y=5.2832255495120535], Punto [x=6.261272663190281, y=8.498250425325205], Punto [x=9.837364250585487, y=9.432983186113765], Punto [x=1.30767189609732, y=5.060288960568307], Punto [x=4.49687032571352, y=2.3321507921776643], Punto [x=4.955173196793431, y=5.693062134687063], Punto [x=2.738403356559873, y=2.89624140091308], Punto [x=0.6500644564713121, y=3.0014394302737033], Punto [x=9.860783584476252, y=5.993750791611564], Punto [x=3.9422234512018415, y=2.9059342489994746], Punto [x=8.193671387642418, y=1.8651806352703615], Punto [x=6.053494724030536, y=1.2381673393410508], Punto [x=5.884261928490378, y=9.541016710526923], Punto [x=4.665617549201562, y=0.44506044033486347], Punto [x=5.445190950321646, y=3.882992584180972], Punto [x=0.7634614937138673, y=3.6872178729049763], Punto [x=7.818347317145495, y=2.5233582838638027], Punto [x=3.660339685694274, y=4.173600778344502], Punto [x=1.1565633617374993, y=5.939762982256861], Punto [x=2.435685081257566, y=3.443735971840237], Punto [x=4.784907696465055, y=1.1787524998141574], Punto [x=0.9313911955673815, y=3.4903420605371647], Punto [x=7.875580807975773, y=7.328773833996694], Punto [x=5.1816338435514435, y=4.109399272520431], Punto [x=9.255177078712943, y=8.743965169210297], Punto [x=6.6920065073229615, y=8.671322199144232], Punto [x=9.46033545500216, y=0.23290849632117028], Punto [x=2.3373176697123235, y=8.626047660798278], Punto [x=8.667578953025645, y=6.951903867530273], Punto [x=1.8134144224660087, y=9.486476971873438], Punto [x=4.4453957078707695, y=0.580221170991515], Punto [x=6.556910042402305, y=8.778864711398036], Punto [x=1.4113927360126222, y=2.505171052827815], Punto [x=9.837712075752956, y=9.505375229710161], Punto [x=0.824606142026566, y=4.207734338932939], Punto [x=6.332761498265088, y=1.0331807752899191], Punto [x=1.9028291179966184, y=4.81487114997447], Punto [x=0.9054091338880021, y=3.0061031787484316], Punto [x=8.227076757482402, y=5.87252666265655], Punto [x=0.5433683966878533, y=6.868954103824204], Punto [x=1.9800739393306788, y=3.793743161236419], Punto [x=0.44920921523920465, y=3.901359135344784], Punto [x=5.96292322059073, y=1.1491719830750868], Punto [x=5.130856323989087, y=8.27699686646843], Punto [x=8.343865036853275, y=8.992675052265218], Punto [x=8.005589291911495, y=8.595825406547416], Punto [x=7.9153206894526305, y=3.752595289667208], Punto [x=8.509544351919809, y=1.581005654675024], Punto [x=8.27016281250544, y=3.8696636504153012], Punto [x=3.9957381707899318, y=7.188874895297671], Punto [x=7.755432515155171, y=3.3254044276405628], Punto [x=4.807150446154091, y=5.249461466077667], Punto [x=8.32148008175837, y=1.4802862137396844], Punto [x=4.827417720616783, y=9.93667736872277], Punto [x=0.4567797676410412, y=1.2287636445657968], Punto [x=6.5402001458369785, y=9.861458538026245], Punto [x=3.2834288991373652, y=0.37873928644386545], Punto [x=9.169311741511834, y=8.387769322010309], Punto [x=8.585608631570524, y=4.375867665625921], Punto [x=0.8252033547198845, y=0.8905279932342003], Punto [x=5.053051930147325, y=2.01851554400354], Punto [x=0.7494201090292429, y=3.106145447143528], Punto [x=4.34382437769456, y=9.647082325447382], Punto [x=5.72715801219029, y=7.470516486112043], Punto [x=3.7054973334843755, y=3.4417735731738244], Punto [x=5.529064653782275, y=2.395939587795529], Punto [x=0.8410485825699499, y=3.9258127553372346], Punto [x=5.846948241440629, y=2.807582906834324], Punto [x=5.46560107205433, y=1.546468384369224]]\r\n"
]
}
],
"source": [
"List<Punto> l=new ArrayList<>();\n",
"for(int i=0; i<100; i++){\n",
" l.add(new Punto(Math.random()*10,Math.random()*10));\n",
"}\n",
"System.out.println(l);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Para finalizar, observa la siguiente línea de código e intenta deducir para qué sirve. \n",
"\n",
"Como pista te diré que el parámetro del método *filter* es una expresión lambda en java (tienen la forma *entrada -> salida*). Recuerda que una expresión lambda no es más que una función (o método en este caso) 'de usar y tirar' que no tiene nombre, y que sólo tiene la entrada a dicha función y lo que devuelve. La entrada de dicha expresión lambda es un objeto *Punto*, y la salida es *boolean*. \n",
"\n",
"Fíjate además que lo que se obtiene al final es una sublista de la lista inicial y que cada vez que se usa un punto, sólo es una llamada a un método desde un objeto producido por un paso anterior. Veámoslo desglosado: \n",
"\n",
"+ ```Stream<Punto> s1=l.stream();```\n",
"+ ```Stream<Punto> s2=s1.filter(punto -> puntoEnCirculo(punto, circulo));```\n",
"+ ```List<Punto> res=s2.collect(Collectors.toList());```\n",
"\n",
"\n",
"No te preocupes demasiado. Todo esto (y algunas cosas más) se irán viendo a lo largo del curso de forma recurrente."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Punto [x=1.0624984976271834, y=3.575723415213666], Punto [x=2.3523220824962596, y=2.04687670747999], Punto [x=0.6500644564713121, y=3.0014394302737033], Punto [x=0.7634614937138673, y=3.6872178729049763], Punto [x=0.9313911955673815, y=3.4903420605371647], Punto [x=1.4113927360126222, y=2.505171052827815], Punto [x=0.824606142026566, y=4.207734338932939], Punto [x=0.9054091338880021, y=3.0061031787484316], Punto [x=0.44920921523920465, y=3.901359135344784], Punto [x=0.4567797676410412, y=1.2287636445657968], Punto [x=0.8252033547198845, y=0.8905279932342003], Punto [x=0.7494201090292429, y=3.106145447143528], Punto [x=0.8410485825699499, y=3.9258127553372346]]"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"l.stream().filter(punto -> puntoEnCirculo(punto, circulo)).collect(Collectors.toList());"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Java",
"language": "java",
"name": "java"
},
"language_info": {
"codemirror_mode": "java",
"file_extension": ".jshell",
"mimetype": "text/x-java-source",
"name": "Java",
"pygments_lexer": "java",
"version": "13.0.1+9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}