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

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

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

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

Q&A

解決済

2回答

1222閲覧

Java メソッドの引数の書き方

tamura0425

総合スコア37

Java

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

0グッド

1クリップ

投稿2019/10/27 08:39

``

import static java.util.function.Function.;
import static java.util.stream.Collectors.
;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;

public class Main {

static Scanner sc = new Scanner(System.in); static ArrayList<Integer> arrayInt = new ArrayList<Integer>(); static ArrayList<String> arraystr = new ArrayList<String>(); public static void main(String[] args) throws Exception{

//ここから
Map<String, Long> map = Arrays.asList("HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO")
.stream()
.collect(groupingBy(identity(), counting()));

for(Long val : map.values()){ if(val > 1) { System.out.println(val); } }

//ここまで

}

}

上記のコードのmapをメソッドにして引数とした渡したいのですが、記載方法がわからず困っております。 お忙しいところ恐縮ですがどなたかご教示いただけますと幸いです。

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

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

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

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

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

swordone

2019/10/27 09:04

> 上記のコードのmapをメソッドにして引数とした渡したい 申し訳ないですが、意味が分からないです。
xebme

2019/10/27 09:15

メソッドではなくmapを供給するSupplier関数でしょうか。関数インターフェースのAPIと用例を調べて質問に追記してください。javaのバージョンも追記してください。
m.ts10806

2019/10/27 10:12

マークダウン正しくできていませんのでヘルプページなど参照し、投稿前にプレビュー確認してください
tamura0425

2019/10/29 12:57

ご回答ありがとうございます。 また、返信が遅くなり申し訳ありません。 もう一度、勉強しなおしてきます。
guest

回答2

0

こういうことでしょうか?

java

1 Long count(List<String> airports) { 2 Map<String, Long> map = airports.stream() 3 .collect(Collectors.groupingBy( 4 Function.identity(), Collectors.counting() 5 )); 6 7 for (Long val : map.values()) { 8 if (val > 1) { 9 return val; 10 } 11 } 12 13 return null; 14 }

投稿2019/10/27 13:43

A-pZ

総合スコア12011

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

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

tamura0425

2019/10/29 13:05

ご回答ありがとうございます。 また、返信が遅くなり申し訳ありません。 勉強不足でMapなどの使い方が完全にできていないため、説明が上手くできなくてすみませんでした。 私の考えといたしましてMainメソッドでHashMapを作成し、作ったデータを処理メソッドに引数で渡すには、Mainメソッドでどのように記載するればよいかわかりませんでした。 頂いた資料を基にもう一度勉強しなおしてきます。 ご指導のほど本当にありがとうございました。
guest

0

ベストアンサー

質問の解釈
質問の意図を『関数をメソッドの引数にとるにはどうすればよいか』と解釈します。バージョンは、Java 8とします。

【第1案】 Function<T,U>、 Consumer<T>

まずmapを作る関数(Function)を定義します。関数の型は、List<String> -> Map<String, Long>

Java

1Function<List<String>,Map<String, Long>> supplyMap = x -> x.stream().collect(groupingBy(identity(), counting()));

質問の動作を実行させる、カウントした度数を表示する消費者(Consumer)をつくります。内部でsupplyMap.apply(x)を呼びます。関数の型は、List<String> -> void?

Java

1Consumer<List<String>> showFreqs = x -> supplyMap.apply(x).values().stream().filter(e -> e > 1).forEach(System.out::println);

メソッドの引数

消費者をメソッドの引数として渡して評価します。

Java

1static void evaluateConsumer(Consumer<List<String>> f) { 2 List<String> values = Arrays.asList("HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO"); 3 f.accept(values); 4}

【第2案】 Supplier<T>、 Runnable

キャプチャを使って供給者(Supplier)にすると以下のようになります。関数の型は、() -> Map<String, Long>

Java

1List<String> values = Arrays.asList("HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO"); 2Supplier<Map<String, Long>> supplier = () -> values.stream().collect(groupingBy(identity(), counting()));

引数を取らず値も返さない関数。内部で上で定義したsupplier.get()を呼びます。

Java

1Runnable showFreqs2 = () -> supplier.get().entrySet().stream().filter(e -> e.getValue()>1).forEach(System.out::println);

Runnableをメソッドの引数として渡して評価します。

Java

1static void evaluateRunnable(Runnable f) { 2 f.run(); 3}

質問の意図を取り違えていたらごめんなさい。

追記します

【ファイナルアンサー?】 peek()
これでよいでしょうか。曲芸です。何の意味もありません。

  • デバッグ用のpeek()を使って1以上の度数を表示
  • peek()を使うために、MapをEntrySetにばらして、再びMapに組立て直す

(filter()などを使って新しいMapを作るのなら、EntrySetにばらす意味があります ... )

Java

1Function<List<String>,Map<String, Long>> function = 2 x -> x.stream().collect(groupingBy(identity(), counting())) 3 .entrySet().stream() 4 .peek(e -> {if (e.getValue() > 1) System.out.println(e.getValue());}) 5 .collect(toMap(Entry::getKey, Entry::getValue)); 6 7List<String> values = Arrays.asList("HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO"); 8 9Map<String, Long> result = function.apply(values); 10System.out.println(result); 11

【ファイナルアンサー?】が正しいなら前の回答はとりさげます。関数インターフェイスのバリエーションを示しただけ。

投稿2019/10/27 20:54

編集2019/10/28 09:07
xebme

総合スコア1081

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

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

tamura0425

2019/10/29 13:05

ご回答ありがとうございます。 また、返信が遅くなり申し訳ありません。 勉強不足でMapなどの使い方が完全にできていないため、説明が上手くできなくてすみませんでした。 私の考えといたしましてMainメソッドでHashMapを作成し、作ったデータを処理メソッドに引数で渡すには、Mainメソッドでどのように記載するればよいかわかりませんでした。 頂いた資料を基にもう一度勉強しなおしてきます。 ご指導のほど本当にありがとうございました。
xebme

2019/10/29 14:06

そうですか。よく確かめずに回答してしまい申し訳ありません。この回答は忘れてください。メソッドの仮引数にMapを指定して、そのメソッドを呼ぶときに実引数のMapを渡すだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問