如何在以某些数字开头的地图中查找价值

时间:2019-06-04 13:34:31

标签: java maps

我被困在一个练习中,我应该在其中创建一个方法来检查映射值在开始时是否具有特定的数字链。

该项目必须分为3类:Obywatele(公民),RejestrObywateli(公民注册)和Main。 Obywatele类(公民)需要具有3个String属性(Pesel,名称,姓氏)。属性pesel是一个数字(波兰人的公民ID)。 “剥离”中的前两个数字表示公民的出生年份。 例如,对于pesel 96060501514,出生年份为1996。

我应该在RejestrObywateli类中编写一个方法,该方法可以找到90年代之前出生的所有公民并将其打印出来。

由于private String pesel是一个字符串,我试图将其解析为Integer,但不知道下一步该怎么做。

@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode

public class Obywatel {
    private String pesel;
    private String imie; // name
    private String nazwisko; //surname
}
@Data
@AllArgsConstructor
@NoArgsConstructor

public class RejestrObywateli {
    private Map<String, Obywatel> mapa = new HashMap<>();


    public void dodajObywatela(Obywatel o) {
        mapa.put(o.getPesel(), o);
    }

4 个答案:

答案 0 :(得分:2)

首先:

private Map<Obywatel, String> mapa = new HashMap<Obywatel, String>();

我认为这种结构在将来不会有所帮助。
随你!回答您的问题:

  

我应该在RejestrObywateli类中编写一个方法   查找90年代之前出生的所有公民并打印出来   

如果您只想获取地图的键(Obywatel),则可以使用:

List<Obywatel> collect = mapa.entrySet().stream()
                .filter(c -> Integer.valueOf(c.getValue().substring(0, 2)) < 90)
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());

否则,如果要获取值(String),可以使用:

List<String> collect = mapa.entrySet().stream()
                .filter(c -> Integer.valueOf(c.getValue().substring(0, 2)) < 90)
                .map(Map.Entry::getValue)
                .collect(Collectors.toList());

或者如果您要打印键和值:

mapa.entrySet().stream()
        .filter(c -> Integer.valueOf(c.getValue().substring(0, 2)) < 90)
        .forEach(entry -> System.out.println(String.format("k = %s, v = %s", entry.getKey(), entry.getValue())));

答案 1 :(得分:1)

谢谢大家的回答,但是由于我在Java领域还很陌生,所以我对它们的理解并不深刻。我以自己的方式做过-如果您可以复习,将不胜感激。我创建了一个列表,以后在其中添加了正确的搜索结果,并在方法末尾将其打印出来。

public void findCitizen(int year){
    List<Obywatel> listOfCitizensBornBefore = new ArrayList<>(); 
    for (String s : mapa.keySet()){
        if ((Integer.parseInt(s.substring(0, 2)) + 1900) < year){
            listOfCitizensBornBefore.add(mapa.get(s));
        }
    }
    if (listOfCitizensBornBefore.size() > 0){
        System.out.println(listOfCitizensBornBefore);
    }else{
        System.out.println("No citizen born before the given year");
    }
}

答案 2 :(得分:0)

您确定要将Obywatel用作键并将pesel用作值吗?因为pesel已经包含在对象中,所以对我来说有点愚蠢。

要将数字字符串解析为整数,请使用:Integer.parseInt()Integer.valueOf()

要从地图中获取所有值,请使用:mapa.values()

要从地图上获取所有键,请使用:mapa.keySet()

您还可以使用mapa.forEach((k, v) -> {})

遍历地图。

答案 3 :(得分:0)

创建一种toString()方法来打印找到的方法将很有帮助

/*
1. iterate through the map (access key value)     
    1a. Get the string (value) that contains the value you want to extract.
    1b. Extract the first two using string.substring(0,2);

2. Convert substring to integer using Integer.parseInt(substring);
    2a check if this integer is less than 90 (int<90)

3. if int is less than 90: `System.out.println(value);`
*/