Java 而不是多个if语句
有没有更好的方法来编写它而不是编写多个if语句 我正在解析一个文档,以查找date的实例,并在实例出现时递增intJava 而不是多个if语句,java,if-statement,Java,If Statement,有没有更好的方法来编写它而不是编写多个if语句 我正在解析一个文档,以查找date的实例,并在实例出现时递增int public class OrganisingData { static int jan16=0; static int feb16=0; static int mar16=0;//... static int dec18 public static void Months(String dates) { if (dates.su
public class OrganisingData {
static int jan16=0;
static int feb16=0;
static int mar16=0;//... static int dec18
public static void Months(String dates) {
if (dates.substring(2, 4).equals("16") &&
dates.substring(5,7).equals("01")) {
jan16++;
}
if (dates.substring(2, 4).equals("16") &&
dates.substring(5,7).equals("02")) {
feb16++;...
}
if (dates.substring(2, 4).equals("18") &&
dates.substring(5,7).equals("12")) {
dec18++;
}
}
}
我试图建立一个条形图,1月16日至2月16日等代表月份和年份,每次我发现坚持该日期(如2016-01-15),我都会增加1月16日。因此,有没有更好的方法来编写这些报表,而不是每月+每年编写多个if报表(总共32个if报表) 您可以使用a来减少笨拙的逻辑,尽管这不一定会大大简化。您需要使用或将日/月值转换为整数
String day = dates.substring(2, 4);
String month = dates.substring(5, 7);
switch (month) {
case "01" : {
if (day.equals("16"))
jan16++;
break;
}
}
如果你想做的事情背后有某种模式,可能会有更好的解决方案。例如,以下是每月的第16次
int count[] = new int[12];
...
int day = Integer.parseInt(dates.substring(2, 4));
int month = Integer.parseInt(dates.substring(5, 7));
if (day == 16)
count[month - 1]++;
使用以下内容循环浏览您的文档:
// 18 years(more needed?), 12 months
String[][] yearsAndMonths = new String[18][12];
yearsAndMonths[dates.substring(5,7)][dates.substring(2, 4)]++;
然后打印结果
我不是java专家。刚刚提供的代码为您提供了逻辑。使用适当的数据结构,您可以大大减少此代码。 这个想法是要有一个数据结构,对于您感兴趣的每一年,它都包含一个整数数组:每个月一个 然后,将
日期
字符串中的子字符串转换为数字,您可以使用这些数字来索引数据结构
import java.util.Map;
import java.util.HashMap;
private static Map<Integer, int[]> years = new HashMap<>();
private static String[] monthNames = new String[] {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
static {
for(int year = 16; year <= 18; year++) {
years.put(year, new int[12]);
}
}
public static void months(String dates) { // method names should start with lower case
int year = Integer.parseInt(dates.substring(2, 4));
int month = Integer.parseInt(dates.substring(5, 7)) - 1; // date String is one-based, array-index is zero-based
years.get(year)[month]++;
}
public static void print() {
for(int year = 16; year <= 18; year++) {
int[] monthCounts = years.get(year);
for(int month = 0; month < 12; month++) {
System.out.println(monthNames[month] + " " + year + ": " + monthCounts[month]);
}
}
}
import java.util.Map;
导入java.util.HashMap;
私有静态映射年数=新HashMap();
私有静态字符串[]monthNames=新字符串[]{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
静止的{
对于(int year=16;year来说,基本上是@John T和@Zachary所说的内容的混合,但是有适当的语法和类型转换
// [Years] and [Months], where [0][0] is jan 2000. May need to adjust for previous years.
int[][] days = new int[30][12];
void month(String dates) {
int year = Integer.parseInt(dates.substring(2, 4));
int month = Integer.parseInt(dates.substring(5,7)) - 1;
days[year][month]++;
}
YearMonth
显然,您希望跟踪年-月值。在java.time包中有一个用于跟踪年-月值的类,名为,嗯。查找该类,它取代了与最早版本的java捆绑在一起的非常麻烦的旧日期-时间类
MonthDay
或者你是在为月日价值而射击;你的问题很复杂,所以我不确定你的目标。但如果这是你的目标,同样,有一门课是这样的:
月份
或者,您可能只想要月份,而不管年份或月份的哪一天,在这种情况下,您可以使用该类
LocalDate
如果您的输入字符串表示一年、一个月和一个月中的一天,请将其解析为LocalDate
。此类没有时间和时区
LocalDate ld = LocalDate.parse( "2016-01-15" ) ;
提取YearMonth
、MonthDay
或Month
YearMonth ym = YearMonth.from( ld ) ;
创建一个集合。也许您希望在特定的年-月内保留所有不同的LocalDate
对象集。如果是这样,请制作一个Map
,其中每个YearMonth
对象都拥有一组LocalDate
对象
Map < YearMonth, Set < LocalDate > > map = new HashMap <>();
手拿集合
,添加您的LocalDate
set.add( ld );
处理后,您可以从地图
中获取YearMonth
键的集合。对于其中的每一个键,您可以检索它拥有的集
,并获取包含的元素计数
兰巴河酒店
对于较短的代码,您可能可以将Lambda语法和流与一起使用。我见过这种代码,但还没有尝试过
map.computeIfAbsent( key , k -> new TreeSet< LocalDate >() ).add( ld ) ;
map.computeIfAbsent(key,k->newtreeset()).add(ld);
只算
如果只需要计数,而不关心LocalDate
值,请将Set
替换为“值”或者使用Integer
对象Map
。与其检索Set
并将其添加,不如检索Integer
并通过添加一个来增加它。就我个人而言,在这种情况下,我发现最好收集LocalDate
值,以便进行调试/测试和/或在中进一步使用其他业务逻辑
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
classes
从哪里获得java.time类
- 然后
- 内置的
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(如果代码正常工作,这个问题可能更适合。
String a=dates.substring(2,4),b=dates.substring(5,7);
然后改用a
和b
吗?您可能希望对jan16、feb16、march16…变量使用数组。然后您可以使用for循环,将int迭代器转换为字符串,并将其与输入字符串进行比较。您不能使用字符串对数组进行索引。此外,我刚刚注意到,您正在声明的数组>Strings
–你不能像在int上那样使用++
操作符。字符串数组也会将所有内容默认为null
。如果你可以使用++
,它会抛出一个NullPointerException
,该代码是用来表示逻辑的。我确信它可以在Java中调整为正确的方式。这就是没有理由提供完全错误的代码。请编辑您的帖子,使其不包含错误,或将其删除。
map.computeIfAbsent( key , k -> new TreeSet< LocalDate >() ).add( ld ) ;