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

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

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

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

Q&A

解決済

1回答

458閲覧

他クラスで作成したMapを使用したい

hiyori_

総合スコア4

Java

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

0グッド

1クリップ

投稿2022/05/18 12:49

編集2022/05/18 13:41

簡易的なチャットシステムを作成したいです。
ログインしたらその人が作成したチャンネルとチャットが表示される、discordに近いものにしたいです。

ユーザー→名前(name)、パス(pass)、チャンネルリスト(Map<String,List>data)
チャンネル→チャンネルの名前、チャット
を持たせればよいと考えたのですが、Channelクラスで作ったリストをUserクラスにどのように渡したらいいかわかりません。また、順序関係的にまずユーザーが作成されてその後チャンネルを追加していく形になるのですが、上記のような構造でも問題はないでしょうか?

つたない文章で申し訳ないです。java初心者なのですが現状できる最大限のことをしたつもりです。迷走してしまって拙い箇所多々あると思いますが、ご教授いただけますと幸いです。
よろしくお願いいたします。

該当のソースコード

java

1//User.java 2@Controller 3public class User {//ユーザを登録する 4 String name;//登録する名前 5 String pass;//登録するパス 6 String loginName;//ログインの時に入力した名前 7 String loginPass;//ログインの時に入力したパス 8 String returnPass;//HashMapから返されたパスを格納するところ 9 Map<String,String> users = new HashMap<>(); 10 Map<String,Map>data = new HashMap<>();//ユーザーとチャンネルマップを結びつけるところ 11 12 User(String name,String pass,Map data){ 13 this.name = name; 14 this.pass = pass; 15 this.data = data; 16 } 17 18 @RequestMapping("/addUser") 19 public String addUser(@RequestParam("name")String name, @RequestParam("pass")String pass){ 20 users.put(name,pass); 21 return "login.html"; 22 } 23 24 25 public String getName(){ 26 return name; 27 } 28 29 public String getPass(String a){//名前を入力してマップからパスを返してもらう 30 return users.get(a); 31 } 32 33 34 public void loginUser(String loginName,String loginPass){//ログイン情報が入る 35 this.loginName = loginName; 36 this.loginPass = loginPass; 37 } 38 39 //ログイン処理 40 41 }

java

1//Channel.java 2public class Channel{ 3String channelName;//チャンネルの名前 4 String checkName;//チャンネルの名前が存在するかMapを調査するため 5 Boolean check;//あるかないかの判定 6 7 8 List<String>chats = new ArrayList();//チャットのリスト 9 Map<String,List>channel = new HashMap<>();//チャンネルのマップ Stringはチャンネル名、Listはチャット →こことUserを関連させたい 10 11 12 13 public Channel(String channelName,List<String>chats){ 14 this.channelName = channelName; 15 this.chats = chats; 16 channel.put(channelName,chats);//チャンネルに名前とチャットを入れる 17 } 18 @RequestMapping(value = "/create") 19 public String addChannel(@RequestParam("channelName") String channelName){//チャンネルを新しく追加する 20 channel.put(channelName,chats); 21 //data.put(User.getName(), (Channel) channel); 22 return "Chat.html"; 23 } 24 25 26@RequestMapping(value = "/serect") 27 public void showing(@RequestParam("checkName") String checkName){//チャンネルが既にあるかどうかを確かめるところ 28 check = channel.containsKey(checkName); 29 if(check = true){ 30 System.out.println("チャンネルを選択"); 31 channel.get(checkName);//チャンネルにあるリストを返す 32 }else if(check = false){ 33 System.out.println("チャンネルを作成"); 34 channel.put(channelName,chats);//チャンネル一覧に入れる 35 36 }else{ 37 System.out.println("エラー"); 38 } 39 40 41 } 42 43 44 public Map getMap(){ 45 return channel; 46 } 47 public String getChannelName(){ 48 return channelName; 49 } 50}

java

1//chat 2@Controller 3public class Chat { 4 private List<String> chats = new ArrayList(); 5 6 String logName; 7 8 9 String chatlog(Model model) { 10 //追加処理 11 } 12 @RequestMapping(value="/addchat") 13 String addChat(@RequestParam("name") String name, 14 @RequestParam("chat") String chat) { 15 16 //追加処理 17 } 18 19 void addChat(String name,String chat, Channel channel) { 20 var nowChat = channel.chats; 21 if (!chat.isBlank()) { 22 nowChat.add(name + ":" + chat); 23 } 24 }

java

1public class ChatApplication { 2 3 public static void main(String[] args) { 4 SpringApplication.run(ChatApplication.class, args); 5 } 6 7}

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

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

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

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

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

jimbe

2022/05/18 13:27 編集

なぜ channnel.java や main メソッドのコードがクラスのテイを成していないのでしょうか。 また、 アノテーションが付いていますが、何でしょうか。
hiyori_

2022/05/18 13:39

channel,mainは両方ともこちらに記載する際に落ちてしまったようです。ご指摘ありがとうございます、修正します。 アノテーションはhtmlと結合させるためにつけています。
jimbe

2022/05/18 13:52

修正ありがとうございます。 > アノテーションはhtmlと結合させるため つまり、これらのコードはこれらダケでは動作しないものですね。 フレームワークをご利用であればそれらについても言及して頂かなければ、こちらには何も分かりません。 最後の main の中身からは Spring をご利用のようです。であれば、ご質問のタグに Spring を付けたほうが良いように思います。
hiyori_

2022/05/18 15:01

記載不足、申し訳ないです┏● ご助言大変ありがとうございます! そのように致します。
guest

回答1

0

ベストアンサー

Spring Boot にさほど詳しくないため、Spring Boot 向きではない話に仕上がっているのかもしれませんが、他に回答が付いていないようだったので答えてみます。

上記のような構造でも問題はないでしょうか?

ベストな方法かどうかはさておいて、とにかく必要なデータが最低限どこかにあればいいわけですから、そういう意味では問題ないと思います。

Channelクラスで作ったリストをUserクラスにどのように渡したらいいか

そもそものところ、データ的な情報を Controller に持たせるのは、設計上好ましくないんじゃないかと思います。

今回は、データベース等は使わず、すべてインメモリで済ませて良いものとお見受けしますので、データを持たせるクラスを1つ作り、その static フィールドにデータを集約してしまうのが、1つの方策になると思います。データの登録・取得メソッドも、ここに集めます。

こんな感じで良いと思います。(イメージです。完成品ではありません)

Java

1 2public class ChatSystem { 3 4 5 /** ユーザ情報: Map<ユーザ名, パスワード> */ 6 private static final Map<String, String> USERS = new HashMap<>(); 7 8 /** ログイン済ユーザ情報: Set<ユーザ名> */ 9 private static final Set<String> USERS_LOGGED_IN = new HashSet<>(); 10 11 /** チャンネル情報: Map<チャンネル名, Set<ユーザ名>> */ 12 private static final Map<String, Set<String>> CHANNELS = new HashMap<>(); 13 14 /** チャット内容: Map<チャンネル名, List<チャットメッセージ>> */ 15 private static final Map<String, List<String>> MESSAGES = new HashMap<>(); 16 17 /* 初期設定 */ 18 static { 19 20 // 初期ユーザー 21 String user = "管理者"; 22 createUser(user, "password"); 23 24 // 初期チャンネル 25 String channel = "テスト用チャンネル"; 26 createChannel(user, channel); 27 28 // 初期投稿 29 String message = "これはテスト用の投稿です"; 30 post(user, channel, message); 31 } 32 33 34 /** 35 * @return true: 作成成功、false: 作成失敗 36 */ 37 public static boolean createUser(String user, String pass) { 38 39 USERS.put(user, pass); 40 41 return true; 42 } 43 44 /** 45 * @return true: ログイン成功、false: ログイン失敗 46 */ 47 public boolean login(String user, String pass) { 48 49 USERS_LOGGED_IN.add(user); 50 51 return true; 52 } 53 54 /** 55 * @return true: 作成成功、false: 作成失敗 56 */ 57 public static boolean createChannel(String user, String channel) { 58 59 CHANNELS.put(channel, new HashSet<>()); 60 61 MESSAGES.put(channel, new ArrayList<>()); 62 63 return true; 64 } 65 66 /** 67 * チャンネルに参加する。 68 * 69 * @return true: 参加成功、false: 参加失敗 70 */ 71 public static boolean join(String user, String channel) { 72 73 CHANNELS.get(channel).add(user); 74 75 return true; 76 } 77 78 /** 79 * チャットを投稿する。 80 * 81 * @return true: 投稿成功、false: 投稿失敗 82 */ 83 public static boolean post(String user, String channel, String message) { 84 85 MESSAGES.get(channel).add(user + " さん: " + message); 86 87 return true; 88 } 89 90 public static Set<String> getChannels() { 91 92 return CHANNELS.keySet(); 93 } 94 95 public static Set<String> getMembers(String channelName) { 96 97 return CHANNELS.get(channelName); 98 } 99 100 public static Set<String> getUsersLoggedIn() { 101 102 return USERS_LOGGED_IN; 103 } 104 105 public static List<String> getMessages(String channelName) { 106 107 return MESSAGES.get(channelName); 108 } 109}

Controller の方では、基本的には、その static メソッドを呼ぶだけにします。

Java

1 2@Controller 3public class ChatController { 4 5 6 @RequestMapping("/createUser") 7 public String createUser(@RequestParam("user") String user, @RequestParam("pass") String pass, Model model) { 8 9 if (ChatSystem.createUser(user, pass)) { 10 11 model.addAttribute("result", user + " を登録しました。"); 12 } 13 14 model.addAttribute("channels", ChatSystem.getChannels()); 15 16 return "index.html"; 17 } 18}

投稿2022/05/20 18:34

momodx

総合スコア185

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

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

momodx

2022/05/20 18:36

ところで、画面表示の方はうまくいっていますか? 老婆心ながら、 ① ユーザ作成機能を(画面周りまで)動くようにする ② ログイン機能を(同じく)動くようにする ③ チャンネル表示機能 ④ チャンネル作成機能 の様にひとつずつ仕上げていかないと、だんだんと何をやって良いか分からない状態になっていってしまうと思いますよ。
hiyori_

2022/05/23 03:14

とても分かりやすいご説明ありがとうございました。 参考にさせていただきます┏●
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問