我们如何在hashmap< string,string>对象内部使用out循环hashset< hashmap< string,string>>进行搜索?

lxkprmvk  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(457)
  1. HashSet<HashMap<String, String>> Assets = new HashSet<>();
  2. HashMap<String, String> Items=new HashMap<>();
  3. Items.put("AssetId","1");
  4. Items.put("AssetName","Table");
  5. Items.put("AssetType","1");
  6. Assets.add(Items);
  7. Items=new HashMap<>();
  8. Items.put("AssetId","2");
  9. Items.put("AssetName","Chair");
  10. Items.put("AssetType","1");
  11. Assets.add(Items);
  12. Items=new HashMap<>();
  13. Items.put("AssetId","3");
  14. Items.put("AssetName","Computer");
  15. Items.put("AssetType","2");
  16. Assets.add(Items);
  17. Items=new HashMap<>();
  18. Items.put("AssetId","4");
  19. Items.put("AssetName","Printer");
  20. Items.put("AssetType","2");
  21. Assets.add(Items);
  22. HashSet<HashMap<String, String>> AssetsFiltered= Assets.filter("AssetId","1,3");

我需要这样的东西:
如果我们用 key 并指定 value 我们应该找一个过滤器 HashSet<HashMap<String, String>> 对象。任何范围?。
或任何其他简单的方法来做这种类型的过滤。我已经准备好改变这个了 HashSet 概念。
请注意,我不希望代码包含任何类型的循环,如for,while,do while等。

kx5bkwkv

kx5bkwkv1#

我不知道这是不是一个好主意,但我决定用下面的代码。

  1. fun filteredAssetList(key: String, value: String, IsIn: Boolean): HashSet<HashMap<String?, String?>> {
  2. try {
  3. val filter2 = Assets.asSequence().filter { pred -> getFilterCase(pred, key, value, IsIn) }
  4. val AssetsFiltered2: HashSet<HashMap<String?, String?>> = filter2.toHashSet()
  5. return AssetsFiltered2;
  6. } catch (e: Exception) {
  7. val Assets2: HashSet<HashMap<String?, String?>> = HashSet();
  8. return Assets2;
  9. }
  10. }
  11. fun getFilterCase(Item: HashMap<String?, String?>, key: String, value: String, IsIn: Boolean): Boolean {
  12. val lstValues: List<String> = value.split(",").map { it -> it.trim() }
  13. var IsFound: Boolean = false
  14. if (IsIn) {
  15. lstValues.forEach { str -> IsFound = (IsFound || Item[key].equals(str)) }
  16. } else {
  17. IsFound = true
  18. lstValues.forEach { str ->
  19. if (Item[key].equals(str)) {
  20. IsFound = false
  21. return@forEach
  22. }
  23. }
  24. }
  25. return IsFound
  26. }

参数 IsIn 用于包含或不包含if的情况 IsIntrue 它将返回过滤器值中的所有资产列表,如果 IsInfalse 它将返回所有不在筛选值中的资产列表。
但我用的是 forEach 给。哈哈。。

展开查看全部
nqwrtyyt

nqwrtyyt2#

你试过使用stream.filter吗?下面这样的方法应该可以达到目的:

  1. Set<HashMap<String, String>> AssetsFiltered = Assets.stream()
  2. .filter(asset ->
  3. List.of("1","3").contains(asset.get("AssetId")))
  4. .collect(Collectors.toSet());

这也将是npe安全的情况下,你没有任何资产的ID你试图筛选。
如果您希望它更通用,并且能够以数字方式传递键和值,您可以使用以下内容:

  1. public Set<Map<String, String>> filter(Set<Map<String, String>> assets, String key, List<String> values){
  2. return assets.stream()
  3. .filter(asset -> values.contains(asset.get(key)))
  4. .collect(Collectors.toSet());
  5. }

如果需要将允许的值作为单个字符串传递(如示例中所示),则始终可以调用 .split(",") 在上面。

展开查看全部
vsmadaxz

vsmadaxz3#

我在kotlin代码中进行了尝试,首先我们需要将hashset更改为sequence,并使用所需的值按键过滤。
代码如下:

  1. val Assets: HashSet<HashMap<String?, String?>> = HashSet()
  2. var Items: HashMap<String?, String?> = HashMap()
  3. Items["AssetId"] = "1"
  4. Items["AssetName"] = "Table"
  5. Items["AssetType"] = "1"
  6. Assets.add(Items)
  7. Items = HashMap()
  8. Items["AssetId"] = "2"
  9. Items["AssetName"] = "Chair"
  10. Items["AssetType"] = "1"
  11. Assets.add(Items)
  12. Items = HashMap()
  13. Items["AssetId"] = "3"
  14. Items["AssetName"] = "Computer"
  15. Items["AssetType"] = "2"
  16. Assets.add(Items)
  17. Items = HashMap()
  18. Items["AssetId"] = "4"
  19. Items["AssetName"] = "Printer"
  20. Items["AssetType"] = "2"
  21. Assets.add(Items)
  22. val filter = Assets.asSequence().filter { pred -> pred["AssetId"] == "2" }
  23. val AssetsFiltered: HashSet<HashMap<String?, String?>> = filter.toHashSet()
  24. val filter2 = Assets.asSequence().filter { pred -> pred["AssetId"] == "1" || pred["AssetId"] == "2" }
  25. val AssetsFiltered2: HashSet<HashMap<String?, String?>> = filter2.toHashSet()
  26. val filter3 = Assets.asSequence().filter { pred -> pred["AssetId"]!!.toInt() >= "1".toInt() && pred["AssetId"]!!.toInt() <= "3".toInt() }
  27. val AssetsFiltered3: HashSet<HashMap<String?, String?>> = filter3.toHashSet()
  28. Log.e("Assets Test", "Test $AssetsFiltered")
  29. Log.e("Assets Test", "Test2 $AssetsFiltered2")
  30. Log.e("Assets Test", "Test2 $AssetsFiltered3")
展开查看全部

相关问题