質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3407閲覧

適用期間の開始日と終了日を含みたい

__student

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/10/09 15:33

編集2021/10/10 02:29

### 重複する期間が登録された際にエラーメッセージを表示する

Javaを勉強中です。
登録される期間が既に登録されている期間と重複している場合エラーメッセージを表示するバリデーションを
作成したいのですが現在のソースだと開始日と終了日が含まれず悩んでいます。
開始日と終了日を含むにはどのように改良すると良いのでしょうか。

現在
9/1~12/31

8/19/1 メッセージ表示されない
8/1
9/2 メッセージ表示される

該当のソースコード

Java

1private ArrayList<Tax> taxList = new ArrayList<>(); 2 public void putTax(Tax tax) { 3 if (taxList.stream() 4 .anyMatch( 5 e -> e.getApplyStartDate().isBefore(tax.getApplyEndDate()) 6 && e.getApplyEndDate().isAfter(tax.getApplyStartDate()))) { 7 System.out.println("税率適用期間に重複があります。登録値を確認してください。"); 8 } 9 10 taxList.add(tax); 11 } 12

Java

1public class Tax { 2 private LocalDate applyStartDate; 3 private LocalDate applyEndDate; 4 private BigDecimal taxRate; 5 6 // setter 7 public void setApplyStartDate(LocalDate start) { 8 this.applyStartDate = start; 9 } 10 11 public void setApplyEndDate(LocalDate end) { 12 this.applyEndDate = end; 13 } 14 15 // Getter 16 17 public LocalDate getApplyStartDate() { 18 return this.applyStartDate; 19 } 20 21 public LocalDate getApplyEndDate() { 22 return this.applyEndDate; 23 } 24}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jhashimoto

2021/10/09 20:44 編集

TaxにgetApplyStartDateやgetApplyEndDateがないので、コンパイルが通りません。コンパイルに必要なコードは全部含めて提示してください。
xebme

2021/10/10 01:09

isBeforeの否定は該当日付を含みかつisAfterなのかも。isAfterの否定は該当日付を含み...。
dodox86

2021/10/10 02:00

> アノテーションの記載漏れがありましたので Lombokは別にJava標準なものではないし、提示のコード中にも示されている訳でもないので、@Dataアノテーションを付けているからといってsetter、getterが自動生成、というのは読んだ者に伝わらないと思います。
__student

2021/10/10 02:30

ご指摘ありがとうございます。 >Lombokは別にJava標準なものではない その通りだと思いましたのでsetterとGetter を記載しました。
guest

回答1

0

ベストアンサー

isAfterやisBeforeはその名の通り「より前」や「より後」かどうかを判定するので、「同じ日」はfalseになります。
同じ日を含むなら、compareToを使うのがいいかと。

java

1 if (taxList.stream() 2 .anyMatch( 3 e -> e.getApplyStartDate().compareTo(tax.getApplyEndDate()) <= 0 4 && e.getApplyEndDate().compareTo(tax.getApplyStartDate()) >= 0))

条件を反転させれば、isAfterやisBeforeを使って書けます。
反転のさせ方はいろいろありますが、個人的にはこう書きますかね。

java

1 if (taxList.stream().anyMatch( 2 e -> !(e.getApplyStartDate().isAfter(tax.getApplyEndDate()) 3 || e.getApplyEndDate().isBefore(tax.getApplyStartDate())) 4 ))

(tax開始~)tax終了→e開始(e終了) または (e開始)e終了→tax開始(~tax終了)
となるのが「正常」なわけですから、「そうではない」ものを探す、という意味で分かりやすいかと、
ただし、Taxクラスの開始日終了日が、「終了日は開始日以後」という当たり前の前提が満たされていれば、の話ですが。

投稿2021/10/10 02:44

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

__student

2021/10/10 03:10

ご教授ありがとうございます。 2種類の書き方と考え方を回答いただきとても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問