2015-12-01 3 views
0

Я создал код, который позволяет пользователю вводить имя планеты и возвращает дату, в которую была найдена планета, иначе она вернет неверное имя планеты.Создание базы данных для поиска

Вопрос в том, как я могу добавить более подробную информацию о коде, например, о силе тяжести.

import java.util.HashMap; 
import java.util.Map; 
import java.util.Scanner; 

public class sky { 

    private static Map < String, Integer > planetMap = new HashMap < String, Integer >(); 

    public static void main(String args[]) { 
    populateDB(); 
    Scanner scanner = new Scanner(System.in); 

    String planetName = scanner.nextLine(); 

    if (planetMap.get(planetName) != null) { 
     System.out.println("The planet " + planetName + " was found in " + planetMap.get(planetName)); 
    } else { 
     System.out.println("Invalid Planet Name"); 
    } 

    } 

    public static void populateDB() { 

    planetMap.put("Earth", 1600); 
    planetMap.put("Mars", 1500); 
    planetMap.put("Jupiter", 1100); 
    planetMap.put("Saturn", 1900); 
    planetMap.put("Venus", 1300); 
    } 
} 

Кредит для phflack и bluelurker.

+1

Для каждой планеты, вместо добавления даты, добавьте еще один хеш, где пары «ключ-значение» содержат дополнительные данные: «earthFacts.put (« found », 1600»); planetMap.put («Земля», EarthFacts); '. –

+0

@MichaWiedenmann карта карт может быть немного избыточной для этого , когда я думаю о карте, я думаю о парах ключ/объект, с близкими значениями объектов. Дата, когда планета найдена, имя планеты и местоположение планеты не очень похоже – phflack

+0

[Раньше вопрос] (http://stackoverflow.com/questions/34025379/joining-both-hashsets-together) – phflack

ответ

2

В зависимости от ваших требований вы можете создать класс Planet и/или использовать Hashmap в качестве значения другого Hashmap.

Что касается касается класса, уже есть ответ, который описывает, как сделать это, так или иначе даст вам пример ниже:

class Planet { 
    String name; 
    String gravityStrength; 
    String universe; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getGravityStrength() { 
     return gravityStrength; 
    } 
    public void setGravityStrength(String gravityStrength) { 
     this.gravityStrength = gravityStrength; 
    } 
    public String getUniverse() { 
     return universe; 
    } 
    public void setUniverse(String universe) { 
     this.universe= universe; 
    } 
} 

Тогда вы можете иметь свой HashMap, как следовать с ключом в качестве имени планеты (строка) и значения как Planet объект:

HashMap<String, Planet> planets = new HashMap<String, Planet>(); 

Planet planetEarth = new Planet(); 
planetEarth.setName("Earth"); 
planetEarth.setGravityStrength("X"); 
planetEarth.setUniverse("The Milky Way"); 

planets.put("earth", planetEarth); 

Или вы могли бы иметь следующий hasmap где ключ это имя планеты как строки, а значение другой HashMap, который имеет планетарное название детали, как ключ и значение детали планет как значение (обе строки).

HashMap<String, HashMap<String, String>> planets = new HashMap<String, HashMap<String, String>>(); 

HashMap<String, String> earth = new HashMap<String, String>(); 
earth.put("name", "Earth"); 
earth.put("gravityStrength": "X4"); 
earth.put("universe", "The Milky Way"); 

planets.put("earth", earth); 

Ниже приводится реализация Planet класса, что делает ваш код. Я переопределил toString() в классе Planet, чтобы разрешить красивую печать объекта Planet.

import java.util.HashMap; 
import java.util.Map; 
import java.util.Scanner; 

public class Sky{ 
    private static Map<String, Planet> planetMap = new HashMap<String, Planet>(); 

    public static void main(String args[]) { 
     populateDB(); 

     Scanner scanner = new Scanner(System.in); 

     System.out.print("Please input planet name: "); 
     String planetName = scanner.nextLine(); 

     //converting to lowercase so user input Earth and earth and EARTH eArTH all match 
     if (planetMap.containsKey(planetName.toLowerCase())) { 
      //invokes the overrided toString() of Planet class 
      System.out.println(planetMap.get(planetName.toLowerCase()).toString()); 
     } else { 
      System.out.println("Invalid Planet Name"); 
     } 
    } 

    public static void populateDB() { 
     Planet earth = new Planet("Earth", "4x", 1600); 
     Planet mars = new Planet("Mars", "1x", 1500); 
     Planet jupiter = new Planet("Jupiter", "3x", 1100); 
     Planet saturn = new Planet("Saturn", "16x", 1900); 
     Planet venus = new Planet("Venus", "5x", 1300); 

     planetMap.put("earth", earth); 
     planetMap.put("mars", mars); 
     planetMap.put("jupiter", jupiter); 
     planetMap.put("saturn", saturn); 
     planetMap.put("venus", venus); 
    } 
} 

class Planet { 
    String name; 
    String gravityStrength; 
    int found; 

    //empty constructor 
    public Planet() {} 

    public Planet(String name, String gravityStrength, int found) { 
     this.name = name; 
     this.gravityStrength = gravityStrength; 
     this.found = found; 
    } 

    /* Getters and setters */ 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    public String getGravityStrength() { 
     return gravityStrength; 
    } 
    public void setGravityStrength(String gravityStrength) { 
     this.gravityStrength = gravityStrength; 
    } 

    public int getFound() { 
     return found; 
    } 
    public void setUniverse(int found) { 
     this.found = found; 
    } 

    //override toString methdo to pretty-print planet 
    public String toString() { 
     return "Planet " + name + " with gravity strenght " + gravityStrength + " was found in " + found; 
    } 
} 

И если вам не нравится реализация в Planet класса, то вы всегда можете использовать HashMap внутри реализацию Hashmap ниже:

import java.util.HashMap; 
import java.util.Map; 
import java.util.Scanner; 

public class Sky { 
    private static Map<String, HashMap<String, String>> planetMap = new HashMap<String, HashMap<String, String>>(); 

    public static void main(String args[]) { 
     populateDB(); 
     Scanner scanner = new Scanner(System.in); 

     System.out.println("Enter planet name to search for: "); 
     String planetName = scanner.nextLine(); 

     if (planetMap.containsKey(planetName.toLowerCase())) { 
      HashMap<String, String> p = planetMap.get(planetName.toLowerCase()); 
      System.out.println("The planet " + planetName + " was found in " + p.get("name") 
        + " and has gravity strenght of " + p.get("gravityStrength")); 
     } else { 
      System.out.println("Invalid Planet Name"); 
     } 

    } 

    public static void populateDB() { 
     HashMap<String, String> earthDetails = new HashMap<String, String>(); 
     earthDetails.put("name", "Earth"); 
     earthDetails.put("gravityStrength", "4X"); 
     earthDetails.put("found", "1600"); 

     HashMap<String, String> marsDetails = new HashMap<String, String>(); 
     marsDetails.put("name", "Mars"); 
     marsDetails.put("gravityStrength", "31X"); 
     marsDetails.put("found", "1500"); 

     HashMap<String, String> jupiterDetails = new HashMap<String, String>(); 
     jupiterDetails.put("name", "Jupiter"); 
     jupiterDetails.put("gravityStrength", "1X"); 
     jupiterDetails.put("found", "1100"); 

     HashMap<String, String> saturnDetails = new HashMap<String, String>(); 
     saturnDetails.put("name", "Saturn"); 
     saturnDetails.put("gravityStrength", "100X"); 
     saturnDetails.put("found", "1900"); 

     HashMap<String, String> venusDetails = new HashMap<String, String>(); 
     venusDetails.put("name", "Venus"); 
     venusDetails.put("gravityStrength", "150X"); 
     venusDetails.put("found", "1300"); 

     planetMap.put("earth", earthDetails); 
     planetMap.put("mars", marsDetails); 
     planetMap.put("jupiter", jupiterDetails); 
     planetMap.put("saturn", saturnDetails); 
     planetMap.put("venus", venusDetails); 
    } 
} 
+0

Вы могли бы написать его в исходном коде, пожалуйста? –

+0

@AmrMixy см. Ответ, я представил реализацию для методов, обсуждаемых в моем ответе изначально. – Raf

4

Если вы хотите больше деталей, то ваш может заменить вашу Map<String, Integer> с Map<String, PlanetDetails>, где PlanetDetails другой класс, который определяется как:

private class PlanetDetails 
{ 
    int date_found; 

    double gravity_strength; 

    double distance_from_sun; 
} 

, а затем при заполнении, вы должны сделать:

planetMap.put("Earth", new PlanetDetails(1600, gravitystrenght, distancefromsun); 
+0

не могли бы вы вставить его в исходный код, пожалуйста? –

+0

Просто определите класс PlanetDetails как частный член класса внутри вашего класса sky или отдельный отдельный класс (импортируйте его, если он отдельный), а затем измените populateDB, чтобы заполнить как: planetMap.put («Земля», новый PlanetDetails (1600, гравитация, расстояние)); Надеюсь, это ясно. – SomeDude

+0

Возможно, было бы проще просто добавить Планету, но PlanetDetails может иметь больше смысла, так как имя не совсем так необходимо – phflack

Смежные вопросы