#java #hashmap
#java #hashmap
Вопрос:
Я хочу иметь возможность печатать hashmap внутри поточного метода, но я не могу понять, как сделать его глобальным или как передать hashmap в качестве параметра функции. Может кто-нибудь помочь мне с этим, пожалуйста? Я думаю, моя проблема в том, что, возможно, я делаю все из одного файла? Возможно ли сделать то, что мне нужно, из одного файла, подобного этому?
Спасибо.
import java.util.Scanner;
import java.util.HashMap;
import java.net.*;
import java.io.*;
import java.lang.Thread;
public class Server{
public static void main(String[] args){
if (args.length < 1) return;
HashMap<String, String> Distances = new HashMap<String, String>(); // here's the map
menu mThread = new menu();
try{
InetAddress ip = InetAddress.getLocalHost();
Distances.put(ip.toString(), "0");
System.out.println(Distances);
} catch (UnknownHostException e){
e.printStackTrace();
}
int port = Integer.parseInt(args[0]);
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("server is listening on port " port);
while(true){
Socket socket = serverSocket.accept();
System.out.println("Client connected");
serverSocket.close();
System.exit(0);
}
} catch(IOException ex) {
System.out.println("exception");
ex.printStackTrace();
}
}
}
class menu implements Runnable{
menu(){
Thread m = new Thread(this);
m.run();
}
public void run(){
printMenu();
}
public void printMenu(){
Scanner input = new Scanner(System.in);
int choice;
System.out.println("1. helpn 2. routingn 3. myPort");
while(choice != 4){
choice = input.nextInt();
if (choice == 1)
System.out.println("control c to quit, otherwise make another selection");
else if (choice == 2)
System.out.println(Distances); // here is the issue
}
}
}
Комментарии:
1. Ваш код не имеет правильного отступа и не соответствует соглашениям об именовании Java. Вы должны программировать для интерфейса (Map или ConcurrentMap), а не для реализации, и использовать синтаксис diamond, чтобы вам не приходилось повторять типы map.
2. Я буду честен и признаю, что я не совсем понимаю, что вы имеете в виду. Я впервые пишу на Java. Я пришел из мира C.
3. Вы бы создали хэш-карту так, как будто
Map<String, String> distances = new HashMap<>();
нет необходимости повторять типы внутри угловых скобок; компилятор может их вывести. С левой стороны вы используете интерфейсMap
, чтобы, если позже вы переключитесь с aHashMap
на aConcurrentHashMap
, вам не нужно было это менять. В Java имена классов (Menu
) и другие определяемые пользователем типы начинаются с прописной буквы, в то время как методы и переменные (distances
) начинаются со строчных букв. Не применяется компилятором, но полезно для ваших коллег-программистов при чтении вашего кода.4. Я понимаю. Спасибо за совет.
Ответ №1:
Во-первых, вы должны знать, что HashMap не является потокобезопасным, поэтому было бы лучше использовать ConcurentHashMap. Один из способов реализовать желаемое поведение — создать класс, который будет принимать map в качестве параметра конструктора, чтобы вы могли передать его и использовать в качестве метода запуска. Затем вам нужно передать экземпляр класса потоку. Вот действительно простой пример — https://intellipaat.com/community/24428/how-can-i-pass-a-parameter-to-a-java-thread .