前提
Javaでテニスの対戦表を作成するプログラムを作成しています。
ペアのリストから休憩になる人が含まれているペアを除いたリスト(pairs)を作成する部分で、休憩になる人の人数が変わった場合、今は休憩する人数のswitchで条件を分けています。(ソースコードの61行目〜101行目)
実現したいこと
stream().filter(p -> !p.getKey().contains(条件)) の 条件に休みの人リスト(List<Integer> rest)を何か一括で指定できる方法はないでしょうか?
Java
1case 2: 2 int r2_1 = rest.get(0); 3 int r2_2 = rest.get(1); 4 5 pairs = pairMap.entrySet().stream() 6 .filter(p -> !p.getKey().contains(r2_1)) 7 .filter(p -> !p.getKey().contains(r2_2)) 8 .filter(p -> p.getValue() == minpair) 9 .map(Map.Entry::getKey) 10 .collect(Collectors.toList());
- そもそもこの手の処理だとStream使わない?
- for文で休憩いなる人とペアをグルグル回さないと書けない?
- きれいな書き方
上記等ありましたらご助言いただけると嬉しいです。
該当のソースコード
Java
1import java.util.List; 2import java.util.*; 3import java.util.stream.*; 4import java.util.stream.Collectors; 5 6class StreamFilterTest { 7 //ペアの組み合わせ作成用 8 static List<List<Integer>> combination(List<Integer> member, int k){ 9 List<List<Integer>> comb = new ArrayList<>(); 10 if(member.size() < k || member.size() <= 0 || k <= 0){ 11 comb.add(new ArrayList<>()); 12 return comb; 13 } 14 for(int i=0; i<=member.size()-k; i++){ 15 Integer p = member.get(i); 16 List<Integer> rest = new ArrayList<>(member); 17 rest.subList(0, i+1).clear(); 18 comb.addAll(combination(rest, k-1).stream().map(list ->{ 19 list.add(0, p); 20 return list; 21 }).collect(Collectors.toList())); 22 } 23 return comb; 24 } 25 26 public static void main(String[] args) { 27 //参加する人数 28 int M = 6; 29 //参加する人数のリスト 30 List<Integer> member = IntStream.range(0, M) 31 .boxed() 32 .collect(Collectors.toList()); 33 34 //ペアの全組み合わせ 35 List<List<Integer>> pairList = combination(member, 2); 36 37 //ペアが何回試合したかを保存するMapを作成 38 Map<List<Integer>, Integer> pairMap = new LinkedHashMap<>(); 39 40 //テスト用に回数を2に設定 41 pairMap = pairList.stream() 42 .collect(Collectors.toMap(l -> l, l -> 2)); 43 //テスト用に3ペアの回数を0に設定 44 pairMap.put(Arrays.asList(0, 1), 0); 45 pairMap.put(Arrays.asList(0, 2), 0); 46 pairMap.put(Arrays.asList(0, 3), 0); 47 System.out.println("pairMap " + pairMap); 48 49 //試合回数の最小値を取得 50 int minpair = Collections.min(pairMap.values()); 51 52 //休みの人のリスト 53 //List<Integer> rest = new ArrayList<>(); 54 //List<Integer> rest = new ArrayList<>(Arrays.asList(1)); 55 List<Integer> rest = new ArrayList<>(Arrays.asList(1, 4)); 56 //List<Integer> rest = new ArrayList<>(Arrays.asList(1, 3, 4)); 57 58 //次に選択できるペアのリスト 59 List<List<Integer>> pairs = new ArrayList<>(); 60 61 //休みの人以外で、試合回数が少ないペアのリストを作成 62 switch(rest.size()){ 63 case 1: 64 int r1 = rest.get(0); 65 66 pairs = pairMap.entrySet().stream() 67 .filter(p -> !p.getKey().contains(r1)) 68 .filter(p -> p.getValue() == minpair) 69 .map(Map.Entry::getKey) 70 .collect(Collectors.toList()); 71 break; 72 73 case 2: 74 int r2_1 = rest.get(0); 75 int r2_2 = rest.get(1); 76 77 pairs = pairMap.entrySet().stream() 78 .filter(p -> !p.getKey().contains(r2_1)) 79 .filter(p -> !p.getKey().contains(r2_2)) 80 .filter(p -> p.getValue() == minpair) 81 .map(Map.Entry::getKey) 82 .collect(Collectors.toList()); 83 break; 84 85 case 3: 86 int r3_1 = rest.get(0); 87 int r3_2 = rest.get(1); 88 int r3_3 = rest.get(2); 89 90 pairs = pairMap.entrySet().stream() 91 .filter(p -> !p.getKey().contains(r3_1)) 92 .filter(p -> !p.getKey().contains(r3_2)) 93 .filter(p -> !p.getKey().contains(r3_3)) 94 .filter(p -> p.getValue() == minpair) 95 .map(Map.Entry::getKey) 96 .collect(Collectors.toList()); 97 break; 98 99 default: 100 pairs = pairMap.entrySet().stream() 101 .filter(p -> p.getValue() == minpair) 102 .map(Map.Entry::getKey) 103 .collect(Collectors.toList()); 104 break; 105 } 106 107 System.out.println("rest " + rest + " min " + minpair + " pairs" + pairs); 108 } 109} 110
補足情報(FW/ツールのバージョンなど)
Java 12.0.1 2019-04-16
回答2件