【问题标题】:Java - Returning an "address" from an ArrayList of names and addressesJava - 从名称和地址的 ArrayList 返回“地址”
【发布时间】:2017-03-12 04:26:37
【问题描述】:

我整天都在处理这个 AP 问题,但没有运气。如果有人可以提供帮助,将不胜感激。

我有一个由名称和地址组成的Strings 中的ArrayList。在地址之后,有一个空的String 并且下一个名称开始。 getAddress 方法接受一个字符串参数(一个名称)并返回人员的地址(名称后面的行包括空字符串,但停在那里)。我在编写此方法时遇到问题。

import java.util.ArrayList;

public class Recipients {
    ArrayList<String> lines = new ArrayList<String>();
    public String extractCity(String cityZip) {
        int pos = cityZip.indexOf(",");
        return cityZip.substring(0, pos);
    }
    public void printNames() {
        System.out.println(lines.get(0));
        for (int i = 0; i < lines.size()-1; i++) 
            if (lines.get(i).substring(0, lines.get(i).length()).equals("")) 
                System.out.println(lines.get(i+1));
    }
    public String getAddress(String name) {
        String address = "";
        int ct = 0;
        int place = 0;
        for (int i = 0; i < lines.size(); i++) {
            if (lines.get(i).substring(0, lines.get(i).length()).equals(name)) {
                place = i;
                for (int j = i+1; j < lines.size(); j++) {
                    ct = j;
                    if (!lines.get(i).substring(0, lines.get(i).length()).equals("")) {
                        ct++;
                    }
                }
                for (int k = place; k < ct; k++) {
                    address = address + lines.get(i);
                }
            }
        }

        return address;
    }
        public void main() {
            lines.add("Mr. J Adams");
            lines.add("Rose St.");
            lines.add("Ithaca, NY 14850");
            lines.add("");
            lines.add("Jack S. Smith");
            lines.add("12 Posy Way");
            lines.add("Suite #201");
            lines.add("Glendale, CA 91203");
            lines.add("");
            lines.add("Ms. M.K. Delgado");
            lines.add("2 River Dr.");
            lines.add("");
            System.out.println(getAddress("Jack S. Smith"));
            System.out.println("test line break");
            }
}

感谢您的宝贵时间。

编辑:这个方法应该写在 Recipients 类中。它有一个假定的构造函数,我在类中编写了其他方法。我已经编辑了课程。我的逻辑有问题。

Worksheet 说:编写 Recipients 类的 getAddress 方法。此方法应返回一个字符串,该字符串仅包含相应名称参数的地址。例如,如果 name 是“Jack S. Smith”,则应返回包含其地址后面三行的字符串。此字符串应在适当的位置包含换行符,包括地址的最后一行之后。

public String getAddress(String name)

【问题讨论】:

  • 我建议创建一个单独保存每个字段的类。
  • 另外,这段代码能编译运行吗?我看到您有一个名为main() 的函数,但是如果您想将其用作代码的入口点是不正确的。
  • @Code-Apprentice 他试图展示他的代码的最小示例。请看stackoverflow.com/help/mcve(;
  • @NickZiebert 我非常了解 MCVE 是什么。如果您查看我个人资料中的评论历史记录,您会看到我要求的频率。
  • @NickZiebert Internet 倾向于定期丢弃讽刺包。

标签: java arraylist


【解决方案1】:

您应该创建用于保存姓名和地址的类。请找到下面提到的方法。

package hello;

import java.util.ArrayList;
import java.util.List;

class Employee {

    private String name;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

public class So3 {

    public static void main(String[] args) {
        List<String> lines = new ArrayList<String>();
        lines.add("Mr. J Adams");
        lines.add("Rose St.");
        lines.add("Ithaca, NY 14850");
        lines.add("");
        lines.add("Jack S. Smith");
        lines.add("12 Posy Way");
        lines.add("Suite #201");
        lines.add("Glendale, CA 91203");
        lines.add("");
        lines.add("Ms. M.K. Delgado");
        lines.add("2 River Dr.");
        lines.add("");

        List<Employee> employees = new ArrayList<Employee>();
        Employee employee = new Employee();
        for (String str : lines) {
            if (str.isEmpty()) {
                if (employee.getName() != null && employee.getAddress() != null) {
                    employees.add(employee);
                    employee = new Employee();
                }
            } else if (employee.getName() == null) {
                employee.setName(str);
            } else {
                if (employee.getAddress() == null) {
                    employee.setAddress(str);
                } else {
                    employee.setAddress(employee.getAddress() + " " + str);
                }
            }
        }

        if (employee.getName() != null && employee.getAddress() != null) {
            employees.add(employee);
        }

        System.out.println(getAddress(employees, "Ms. M.K. Delgado"));

    }

    private static String getAddress(List<Employee> employees, String name) {
        if (employees != null && name != null) {
            for (Employee employee : employees) {
                if (name.equals(employee.getName())) {
                    return employee.getAddress();
                }
            }
        }
        return null;
    }

}

【讨论】:

    【解决方案2】:

    如果您必须按照自己的意愿使用,那么您需要修改您的 getAddress 方法。在您的代码中尝试以下 getAddress 方法:

    public String getAddress(String name) {
        String address = "";
        boolean nameFound=false;
        for(String str:lines)
        {
            if(!nameFound && str.equals(name))
                nameFound=true;
            else if(nameFound && str.isEmpty())
                break;
            else if(nameFound && !str.isEmpty())
                address+=str;
        }
        return address;
    }
    

    【讨论】:

    • 很高兴知道它有帮助!
    【解决方案3】:

    您应该为此使用 HashMap 而不是 ArrayList。这是使用 HashMap 代替的完美场景。

    public class APProblem {
        Map<String, List<String>> lines2 = new HashMap<>();
    
        public List<String> getAddress(String name) {
            return lines2.get(name);
        }
    
            public void main() {
                String name = "Mr. J Adams";
                List<String> address = Arrays.asList("Rose St.", "Ithaca, NY 14850");
                lines2.put(name, address);
                name = "Jack S. Smith";
                address = Arrays.asList("12 Posy Way", "Suite #201", "Glendale, CA 91203");
                lines2.put(name, address);
    
                System.out.println(getAddress("Jack S. Smith"));
                System.out.println("Testing line break.");
                }
    }
    

    【讨论】:

    • 使用Map&lt;String, Address&gt; 代替Map&lt;String, List&lt;String&gt;&gt;,其中Address 是一个自定义类。
    • 不确定如果他要创建一个地址类,地图的用途是什么。
    • Address 类的用途与您的 List&lt;String&gt; 相同,但更清楚。
    • 你为什么不在你的地址类中有一个“名称”字段变量?你又在抱怨吗? (;
    • 当然,您也可以在 Address 类中使用名称。然后你将如何存储一堆地址对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2021-12-05
    • 1970-01-01
    • 2013-07-20
    • 2016-01-10
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多