Java 而不是多个if语句

Java 而不是多个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

有没有更好的方法来编写它而不是编写多个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.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 ) ;