【问题标题】:Adding to a Hashmap via a method (Java)通过方法添加到 Hashmap (Java)
【发布时间】:2018-04-15 16:54:53
【问题描述】:

就这样吧。我有两个课程......

  • “发生了什么”类

使用任务实例变量引用任务类
TaskId 是一个静态 int 并将引用映射键并设置为 1

  • “任务”类 实例变量都是字符串,分别是名称、日期和时间

我想添加一个方法 addTask,它接受 3 个参数并通过 Whatstaking 类添加一个任务。每次添加一个任务时,任务 ID 应该增加 1。这是我目前所拥有的......

public void addTask(String aName, String aDate, String aTime)
{
Map<Integer, Task> tasks = new HashMap<>();
Task newtask = Task (aName,aDate, aTime);
tasks.put(TaskId,newtask);
TaskId = TaskId +1;  
}

但是,当我创建 Whatstaking 的实例(称为 whatsappening)并尝试通过该方法添加任务时,例如 whatsappening.addTask("Take Cat to the vet","010117","1400 ");

添加任务到地图总是失败!

非常感谢任何帮助!

【问题讨论】:

  • 看起来tasks 是一个方法变量,一旦调用addTask 就会超出范围
  • 您总是会创建一个新的 tasks 映射,该映射在 addTask 方法完成后会被遗忘/删除/清理。

标签: java methods hashmap


【解决方案1】:

如果这是您的全部代码,那么原因很明显:

Map&lt;Integer,Task&gt; task = new HashMap&lt;&gt;(); 在堆栈上分配。根据我能想到的大多数语言的内存分配规则,可以追溯到 50 年前,在函数退出时,映射及其所有内容都会被释放。

试试:

public class Thing {
private static Integer TaskId = 0;
public static void main(String .. args) {

     Map<Ineger,Task> tasks = addTask("myName", LocalDate.now()+"", LocalTime.now()+"")
     System.out.println(tasks);
}

private static Map<Integer,Task> addTask(String name, String date, String time) {
    Map<Integer, Task> tasks = new HashMap<>();
    Task newtask = Task (aName,aDate, aTime);
    tasks.put(TaskId,newtask);
    TaskId = TaskId +1; 
    return tasks; // crucial
}
}

这对你有用。

一些好的编程建议:

  1. 你真的不应该接受日期/时间字符串,除非你 必须。他们更难合作
  2. 将您的静态任务 ID 放入 任务类本身以及实例化任务时,在 构造函数赋值this.id = TaskId++

【讨论】:

    【解决方案2】:

    tasks 是一个仅在方法调用期间存在的变量。可能您需要将新的task 放入全局或外部映射中。

    【讨论】:

      【解决方案3】:

      您只是使用Task (aName, aDate, aTime) 创建一个对象,在此方法结束后将不会保留该对象。 尝试以下操作: Task newTask = Task (aName, aDate, aTime) 您必须使用动态分配才能“允许”您的任务超出您的方法范围。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        • 2013-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多