回答編集履歴

3

stream 版追加

2024/05/10 12:00

投稿

jimbe
jimbe

スコア13168

test CHANGED
@@ -49,3 +49,30 @@
49
49
  NGリスト---------
50
50
  [asdfgh1, aSd1234, asd1223, mmm1234, 1234ASD]
51
51
  ```
52
+
53
+ ---
54
+ 【配列をArrayListに変換… ver】改め stream 版では、 ok/ng を true/false としてキーにする Map に集めるようにすることで、stream から二度集めたり二つの正規表現を扱う必要を無くします。
55
+ ```java
56
+ import java.util.*;
57
+ import java.util.regex.*;
58
+ import java.util.stream.*;
59
+
60
+ public class Main {
61
+ public static void main(String[] args) {
62
+ String[] userIdArray = { "ASD1234", "asdfgh1", "aSd1234", "asd1223", "mmm1234", "1234ASD" };
63
+
64
+ Pattern p = Pattern.compile("[A-Z]{3}[0-9]{4}.*");
65
+
66
+ Map<Boolean,List<String>> map =
67
+ Arrays.stream(userIdArray).collect(Collectors.groupingBy(
68
+ userId -> p.matcher(userId).matches() // ok なら true, ng なら false
69
+ ));
70
+
71
+ System.out.println("OKリスト---------");
72
+ System.out.println(map.get(true));
73
+
74
+ System.out.println("NGリスト---------");
75
+ System.out.println(map.get(false));
76
+ }
77
+ }
78
+ ```

2

修正

2024/05/09 18:39

投稿

jimbe
jimbe

スコア13168

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  のように渡さなければなりません。
14
14
 
15
- また、 Pattern はループの中で何度もしなければならないようなことではありませんし、 Pattern を二つに分ける必要も無さそうですし、ok/ngListの表示も振り分けてからでよいのではありませんか?
15
+ また、 Pattern.compile はループの中で何度もしなければならないようなことではありませんし、 Pattern を二つに分ける必要も無さそうですし、ok/ngListの表示も振り分けてからでよいのではありませんか?
16
16
 
17
17
  ```java
18
18
  import java.util.*;

1

リンク・コード等追加

2024/05/09 18:29

投稿

jimbe
jimbe

スコア13168

test CHANGED
@@ -3,10 +3,49 @@
3
3
 
4
4
  メッセージをきちんと読まれていないようです。
5
5
  matcher には対象となる文字列(CharSequence)を指定しなければならないのに i を渡しているのでダメだと言われています。
6
+
7
+ [public Matcher matcher(CharSequence input)](https://docs.oracle.com/javase/jp/8/docs/api/java/util/regex/Pattern.html#matcher-java.lang.CharSequence-)
8
+
6
9
  たとえば、
7
10
 
8
11
  Matcher m1 = p1.matcher(userIdArray[i]);
9
12
 
10
13
  のように渡さなければなりません。
11
14
 
12
- また、 Pattern はループの中で何度もしなければならないようなことではありませんし、Pattern を二つに分ける必要も無さそうですし、ok/ngListの表示も振り分けてからでよいのではありませんか?
15
+ また、 Pattern はループの中で何度もしなければならないようなことではありませんし、 Pattern を二つに分ける必要も無さそうですし、ok/ngListの表示も振り分けてからでよいのではありませんか?
16
+
17
+ ```java
18
+ import java.util.*;
19
+ import java.util.regex.*;
20
+
21
+ public class Main {
22
+ public static void main(String[] args) {
23
+ String[] userIdArray = { "ASD1234", "asdfgh1", "aSd1234", "asd1223", "mmm1234", "1234ASD" };
24
+
25
+ List<String> okList = new ArrayList<>();
26
+ List<String> ngList = new ArrayList<>();
27
+
28
+ Pattern p = Pattern.compile("[A-Z]{3}[0-9]{4}.*");
29
+
30
+ for(String userId : userIdArray) {
31
+ if(p.matcher(userId).matches()) {
32
+ okList.add(userId);
33
+ } else {
34
+ ngList.add(userId);
35
+ }
36
+ }
37
+
38
+ System.out.println("OKリスト---------");
39
+ System.out.println(okList);
40
+
41
+ System.out.println("NGリスト---------");
42
+ System.out.println(ngList);
43
+ }
44
+ }
45
+ ```
46
+ ```
47
+ OKリスト---------
48
+ [ASD1234]
49
+ NGリスト---------
50
+ [asdfgh1, aSd1234, asd1223, mmm1234, 1234ASD]
51
+ ```