Java 如何循环使用HashMap,并根据某些对象的属性将其传递到列表中,以便打印到控制台?
项目的限制要求我使用HashMap作为数据源。我被要求做以下的方法 getAccountsWithMinimum-返回至少具有指定余额的帐户列表 问题是hashmap没有索引。所以我不能用For循环来通过它 我试着根据在Stack Overflow和Geeksforgeks上发现的类似问题改编代码。这种方法不仅不起作用,而且对我也没有多大好处,因为我不明白为什么它会起作用,即使它确实起作用了,但它不会起作用 我试着使用我在Geeksforgeks上找到的代码。它什么也不印Java 如何循环使用HashMap,并根据某些对象的属性将其传递到列表中,以便打印到控制台?,java,Java,项目的限制要求我使用HashMap作为数据源。我被要求做以下的方法 getAccountsWithMinimum-返回至少具有指定余额的帐户列表 问题是hashmap没有索引。所以我不能用For循环来通过它 我试着根据在Stack Overflow和Geeksforgeks上发现的类似问题改编代码。这种方法不仅不起作用,而且对我也没有多大好处,因为我不明白为什么它会起作用,即使它确实起作用了,但它不会起作用 我试着使用我在Geeksforgeks上找到的代码。它什么也不印 public
public void getAccountsWithMinumum() {
Iterator entries = accounts.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer) entry.getKey();
Integer value = (Integer) entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
}
帐户中的对象包含StringfirstName、StringlastName、doublebalance、StringaccountType和StringAccountID属性
我想要得到的是返回所需列表并将其打印到控制台以便我确认它的东西
我不需要有人为我这样做,因为我怀疑这是我最后一次被要求这样做或类似的事情。要么是一些非常有力的提示,这样我就可以填补空白,要么是如果做起来更容易,最好能详细解释一下我为什么这么做。使用Java 8 streams:
List<Accout> accounts = accounts.values().stream()
.filter(account -> account.getBalance() > threshold)
.collect(Collectors.toList())
Map接口的values方法返回存储在Map中的值的集合。您还可以使用entrySet获取键值对集合,或使用keySet仅获取键。使用Java 8流:
List<Accout> accounts = accounts.values().stream()
.filter(account -> account.getBalance() > threshold)
.collect(Collectors.toList())
Map接口的values方法返回存储在Map中的值的集合。您还可以使用entrySet获取键值对集合,或使用keySet仅获取键。从您提供的信息来看,最佳解决方案似乎是将数据从HashMap更改为,以保持顺序 如果您仔细了解javadoc,您会发现以下部分很有用: 他的实现通常使其客户机免受未指定的影响 HashMap和Hashtable提供的混沌排序,没有 导致与TreeMap相关的成本增加。它可以被使用 要生成与原始地图顺序相同的地图副本, 无论原始映射的实现如何:
void foo(Map m) {
Map copy = new LinkedHashMap(m);
...
}
如果一个模块需要一张地图,这种技术特别有用
输入,复制它,然后返回其顺序已确定的结果
通过复印件。客户通常喜欢有东西
返回的顺序与提交的顺序相同
因此,我们的想法是输入映射,在其上创建LinkedHashMap,使用forEach进行迭代。下面是一个带有注释的示例,您可以从中开始详细说明
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
Main main = new Main();
main.test();
}
private void test() {
// your input
HashMap<Integer, Account> accounts = new HashMap<>();
accounts.put(0, new Account("first", 1));
accounts.put(1, new Account("second", 10));
accounts.put(2, new Account("third", 5));
// call your method
List<Account> result = getAccountsWithMinumum(accounts);
System.out.println(result.toString());
}
private List<Account> getAccountsWithMinumum(HashMap<Integer, Account> accounts) {
List<Account> result = new ArrayList<>();
// create linkedhashmap to get order
LinkedHashMap<Integer, Account> data = new LinkedHashMap<>(accounts);
// get entries
for (Entry<Integer, Account> entry : data.entrySet()) {
// print entry
System.out.println("key=" + entry.getKey() + ", value=" + entry.getValue());
// check account balanece on a value, for example 6 (use it as parameter!)
if (entry.getValue().balance < 6) {
// add to the result list
result.add(entry.getValue());
}
}
return result;
}
// your account class
private class Account {
public String name;
public int balance;
public Account(String name, int balance) {
this.name = name;
this.balance = balance;
}
@Override
public String toString() {
return "[name=" + name + ", balance=" + balance + "]";
}
}
}
您的答案有点难回答,因为缺少Hashmap的确切含义,在我的例子中是从您提供的信息来看,最好的解决方案似乎是将数据从Hashmap更改为,保持顺序 如果您仔细了解javadoc,您会发现以下部分很有用: 他的实现通常使其客户机免受未指定的影响 HashMap和Hashtable提供的混沌排序,没有 导致与TreeMap相关的成本增加。它可以被使用 要生成与原始地图顺序相同的地图副本, 无论原始映射的实现如何:
void foo(Map m) {
Map copy = new LinkedHashMap(m);
...
}
如果一个模块需要一张地图,这种技术特别有用
输入,复制它,然后返回其顺序已确定的结果
通过复印件。客户通常喜欢有东西
返回的顺序与提交的顺序相同
因此,我们的想法是输入映射,在其上创建LinkedHashMap,使用forEach进行迭代。下面是一个带有注释的示例,您可以从中开始详细说明
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
Main main = new Main();
main.test();
}
private void test() {
// your input
HashMap<Integer, Account> accounts = new HashMap<>();
accounts.put(0, new Account("first", 1));
accounts.put(1, new Account("second", 10));
accounts.put(2, new Account("third", 5));
// call your method
List<Account> result = getAccountsWithMinumum(accounts);
System.out.println(result.toString());
}
private List<Account> getAccountsWithMinumum(HashMap<Integer, Account> accounts) {
List<Account> result = new ArrayList<>();
// create linkedhashmap to get order
LinkedHashMap<Integer, Account> data = new LinkedHashMap<>(accounts);
// get entries
for (Entry<Integer, Account> entry : data.entrySet()) {
// print entry
System.out.println("key=" + entry.getKey() + ", value=" + entry.getValue());
// check account balanece on a value, for example 6 (use it as parameter!)
if (entry.getValue().balance < 6) {
// add to the result list
result.add(entry.getValue());
}
}
return result;
}
// your account class
private class Account {
public String name;
public int balance;
public Account(String name, int balance) {
this.name = name;
this.balance = balance;
}
@Override
public String toString() {
return "[name=" + name + ", balance=" + balance + "]";
}
}
}
您的答案有点难回答,因为缺少Hashmap的确切含义,在我的例子中,您发现的示例早于在Java中使用泛型。现在,任何映射实际上都是一个映射,其中K是映射中键的类型=键的类,V是键值映射到的值对象的java类的类型。因此,在您的示例中,查看对象被强制转换为什么类型的映射现在将被编写为映射 迭代映射内容有几种不同的方法:迭代其入口集、迭代其键集或迭代其值 第一个结果是Map.Entry类型的对象,如示例中所示,您随后可以从中检索key对象和value对象 第二种方法会产生K类型的key对象,并且显然只会给你key对象,除了使用map.getkey之外,你无法访问相应的value对象,这是相当愚蠢的,因为你已经在迭代了,并且可以免费得到value对象 第三个结果是对象的类型为V类型/类 值对象,而不访问相应的键,除非已使用值对象中的键对象构建贴图 假设您的Account对象是value对象,我想您应该迭代这些值,然后检查每个返回对象的getBalance 或者,您可以使用更现代的lambda风格的语法来使用streams,正如在其他答案中所建议的那样
这就是您要寻找的解释吗?您找到的示例早于在Java中使用泛型。现在,任何映射实际上都是一个映射,其中K是映射中键的类型=键的类,V是键值映射到的值对象的java类的类型。因此,在您的示例中,查看对象被强制转换为什么类型的映射现在将被编写为映射 迭代映射内容有几种不同的方法:迭代其入口集、迭代其键集或迭代其值 第一个结果是Map.Entry类型的对象,如示例中所示,您随后可以从中检索key对象和value对象 第二种方法会产生K类型的key对象,并且显然只会给你key对象,除了使用map.getkey之外,你无法访问相应的value对象,这是相当愚蠢的,因为你已经在迭代了,并且可以免费得到value对象 第三种方法会生成V类型/值对象类的对象,但无法访问相应的键,除非地图是使用值对象中的键对象构建的 假设您的Account对象是value对象,我想您应该迭代这些值,然后检查每个返回对象的getBalance 或者,您可以使用更现代的lambda风格的语法来使用streams,正如在其他答案中所建议的那样
这就是您想要的解释吗?您确定accounts不是空的吗?我有一个带有Main方法的测试床类,在调用该方法之前向其添加了多个条目以避免出现这种情况。您确定accounts不是空的吗?我有一个带有Main方法的测试床类,在该方法之前向其添加了多个条目调用的目的是避免出现这种情况。OP本身不需要索引。他只是不习惯对非有序集合进行迭代。@PM77-1是正确的。我不需要索引。索引正是我最了解的方式。项目需求也要求我使用HashMap。尽管您赞扬了链接HashMap的优点,但它在本例中不起作用,因为projectoutline/prompt.OP本身不需要索引。他只是不习惯对非有序集合进行迭代。@PM77-1是正确的。我不需要索引。索引正是我最了解的方式。项目需求也要求我使用HashMap。尽管您赞扬了链接HashMap的优点,但由于项目大纲/提示,它在本例中不起作用。我很感激。这里的反应迅速而深入。我仍在消化大部分,但我认为这会很好。我有几个类似的方法,我现在应该能够自己执行。谢谢大家!是的。我很感激。这里的反应迅速而深入。我仍在消化大部分,但我认为这会很好。我有几个类似的方法,我现在应该能够自己执行。谢谢大家!第二个街区看起来正是我需要的。结合@Erwin Smout提供的信息,我认为应该可以做到这一点。我能够在我的方法中设置forEach,用一个参数替换threshold。但是我不知道用什么来代替.values。它声明类型列表的方法值未定义。我尝试将这个相同的for循环放在代码块的外部,只是为了查看,它根本不报告任何问题。只有当我试图将其包含在方法中时,我才会遇到问题。哦,对不起,我的错。你需要在地图上调用values方法,而不是在新创建的列表上-让我更新我的答案。然后add也应该应用于accountsWithMinimum,所以你的代码是有效的。不是我的。我在if语句之外添加了一点,并打印了所有的值。因此,很明显,余额设置不正确,只有被告知在一定余额上打印帐户。再次感谢!第二个街区看起来正是我需要的。结合@Erwin Smout提供的信息,我认为应该可以做到这一点。我能够在我的方法中设置forEach,用一个参数替换threshold。但是我不知道用什么来代替.values。它声明类型列表的方法值未定义。我尝试将这个相同的for循环放在代码块的外部,只是为了查看,它根本不报告任何问题。只有当我试图将其包含在方法中时,我才会遇到问题。哦,对不起,我的错。你知道吗
ed在地图上调用values方法,而不是在新创建的列表上-让我更新我的答案。然后add应该应用于accountsWithMinimum,所以是的,你的代码可以工作。不是我的。我在if语句之外添加了一点,并打印了所有的值。因此,很明显,余额设置不正确,只有被告知在一定余额上打印帐户。再次感谢!