[英]JSP, Java, Spring, iterating through HashMap and calling basic getter method from its value?
[英]Take a value from a list through a getter method?
我有 3 个类,人类、日期和十二生肖。 在 Date 我有两种 int 类型,月和日。 我有普通的构造函数和吸气剂。 在人类中,我有一个字符串名称和一个来自日期类型的生日。
我的 Class 日期:
public class Date {
private int month;
private int day;
public Date(int month, int day) {
this.month = month;
this.day = day;
}
public int getMonth() { return month;}
public int getDay() {return day;}
我的 Class 人类
public class Human {
private String name;
private Date birthday;
public Human(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
}
public String getName() { return name;}
public BirthDate getBirthday() { return birthday;}
在我的 class Zodiac 中,我有一个 Main,我在其中创建了一些对象。 然后我有一个方法 zodiacToHuman 如果我给一个人类他的星座。 但这种方法根本不起作用。 该方法有一个列表作为参数并返回一个 Map。
我在 class Zodiac 中的方法:
public static Map<Human, String> zodiacToHuman(List<Human> humanlist){
Map<Human, String> personSign = new HashMap<>();
Human human;
String sign = "";
int day = Date.getDay();
int month = Date.getMonth();
if (month == 1) {
if (day < 20)
sign = "capricornus";
humanSign.put(human, sign);
else
sign = "aquarius";
humanSign.put(human, sign);
}//and so on
}
这是我得到的错误:
不能从 static 上下文引用非静态方法“getDay()”
不能从 static 上下文中引用非静态方法“getMonth()”
变量 Human 可能尚未初始化
有人能帮我吗?
你不能做int day = Date.getDay()
创建日期 class 的第一个 object 并使用它来获取日期和月份
Data date = new Date()
int day = date.getDay()
int month = date.getMonth()
此外,您还没有初始化您的 Human class object。 你可以写
Human human = new Human(some_day, some_month)
据我了解,humanList 包含人类对象的条目。 您应该尝试遍历列表,就像这样
public static Map<Human, String> zodiacToHuman(List<Human> humanlist) {
Map<Human, String> personSign = new HashMap<>();
for (Human human : humanList) {
String sign = "";
int day = human.getBirthday().getDay();
int month = human.getBirthday().getMonth();
if (month == 1) {
if (day < 20) {
sign = "capricornus";
} else {
sign = "aquarius";
}
} //and so on
humanSign.put(human, sign);
}
}
让我们将Date
的名称更改为更精确的MonthWithDay
。
我们可以通过记录来缩短 class 的代码。 默认情况下,隐式创建的 getter 方法的名称与成员字段名称相同。
public record MonthWithDay( int month , int day ) { }
同样,我们可以将您的Human
class 定义为一条短行中的记录。
public record Human( String name , MonthWithDay monthDayWhenBorn ) { }
关于你确定生肖的方法:
public static Map<Human, String> zodiacToHuman(List<Human> humanlist){ …
…不需要static
。 在您的场景中,这似乎是您的Human
class 的一个合理功能。
提示:在面向对象编程中,使用static
不是面向对象的。 尽量减少使用static
。 仅作为最后手段使用。
public record Human( String name , MonthWithDay monthDayWhenBorn )
{
public String zodiac ( )
{
int day = this.monthDayWhenBorn.day();
int month = this.monthDayWhenBorn.month();
if ( month == 1 )
{
if ( day < 20 )
{ return "capricornus"; }
else
{ return "aquarius"; }
}
return "other";
}
}
填充一些示例数据。
List < Human > humans =
List.of(
new Human( "Alice" , new MonthWithDay( 1 , 11 ) ) ,
new Human( "Alice" , new MonthWithDay( 1 , 22 ) ) ,
new Human( "Carol" , new MonthWithDay( 11 , 27 ) )
);
创建您的 map 的人到黄道带。
Map< Human , String > mapOfHumanToZodiac = new HashMap<>() ;
遍历每个Human
object,询问其生肖,然后放入我们的 map。
for ( Human human : humans )
{
mapOfHumanToZodiac.put( human , human.zodiac() );
}
转储到控制台。
System.out.println( "mapOfHumanToZodiac = " + mapOfHumanToZodiac );
mapOfHumanToZodiac = {Human[name=Alice, monthDayWhenBorn=MonthWithDay[month=1, day=11]]=摩羯座, Human[name=Alice, monthDayWhenBorn=MonthWithDay[month=1, day=22]]=水瓶座, Human[name =Carol, monthDayWhenBorn=MonthWithDay[月=11, 日=27]]=其他}
顺便说一句,在实际工作中,我们会定义一个枚举来表示每个星座,而不是仅仅使用字符串。 这样做可以提供类型安全,确保值有效(避免字符串中的拼写错误),并使代码更具自我记录性。
Java 带有行业领先的日期时间类框架,可在java.time package 中找到。 这些类包括MonthDay
class。 所以没必要自己发明。 我们可以删除您的MonthWithDay
class。
调整Human
class。
public record Human( String name , MonthDay monthDayWhenBorn ) // <-- Use java.time.MonthDay class.
{
public String zodiac ( )
{
int day = this.monthDayWhenBorn.getDayOfMonth(); // <-- Use java.time.MonthDay class.
int month = this.monthDayWhenBorn.getMonthValue(); // <-- Use java.time.MonthDay class.
if ( month == 1 )
{
if ( day < 20 )
{ return "capricornus"; }
else
{ return "aquarius"; }
}
return "other";
}
}
更改我们创建示例数据的方式。
List < Human > humans =
List.of(
new Human( "Alice" , MonthDay.of( 1 , 11 ) ) , // <-- Use java.time.MonthDay class.
new Human( "Alice" , MonthDay.of( 1 , 22 ) ) ,
new Human( "Carol" , MonthDay.of( 11 , 27 ) )
);
我们得到相同的结果。
错误和原因
变量 Human 可能尚未初始化
它不是一个错误,它警告说human
变量可能是null
因为你只有 decalre 变量human
。 要初始化,您需要创建一个实例或将 null 分配给它
Human human = new Human(YOUR VALUES);
//or
Human human = null;
不能从 static 上下文引用非静态方法“getDay()”
不能从 static 上下文中引用非静态方法“getMonth()”
如果不创建 object,则无法直接访问 class 的公共方法。
根据我的理解,您给每个human
一个sign
值。您可以在创建每个human
object 并随后从中创建 map 时获得相同的值。 例如:
public class Human {
private String name;
private Date birthday;
private String sign;
public Human(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
assignZodiac();
}
private void assignZodiac(){
String sign = "";
//getting birhday month and day values
int day = birthday.getDay();
int month = birthday.getMonth();
// your logic of assignment
if (month == 1) {
if (day < 20)
sign = "capricornus";
else
sign = "aquarius";
}//and so on
}
//getter setter
}
现在您可以从列表中创建 map。 例如:
// human list has been already created
Map<Human,String> humanSign=newHasmap<>();
for(Human human : humanList) {
humanSign.put(human,human.getSign()) //asuming getSign is the getter for sign filed in Human.
}
另外,我建议您将Date
class 名称更改为其他名称,因为java
已经有一个同名的 class。 只是为了命名对流
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.