Как я могу сделать мою хэш-карту общедоступной для печати из любой точки Java?

#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 , чтобы, если позже вы переключитесь с a HashMap на a ConcurrentHashMap , вам не нужно было это менять. В Java имена классов ( Menu ) и другие определяемые пользователем типы начинаются с прописной буквы, в то время как методы и переменные ( distances ) начинаются со строчных букв. Не применяется компилятором, но полезно для ваших коллег-программистов при чтении вашего кода.

4. Я понимаю. Спасибо за совет.

Ответ №1:

Во-первых, вы должны знать, что HashMap не является потокобезопасным, поэтому было бы лучше использовать ConcurentHashMap. Один из способов реализовать желаемое поведение — создать класс, который будет принимать map в качестве параметра конструктора, чтобы вы могли передать его и использовать в качестве метода запуска. Затем вам нужно передать экземпляр класса потоку. Вот действительно простой пример — https://intellipaat.com/community/24428/how-can-i-pass-a-parameter-to-a-java-thread .