Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 地图也可以是收藏吗?_Java_Collections_Jstl - Fatal编程技术网

Java 地图也可以是收藏吗?

Java 地图也可以是收藏吗?,java,collections,jstl,Java,Collections,Jstl,我想要一张地图,它也是一个收藏。或者更具体地说,我希望能够迭代映射中的条目,包括一个特定键有多个条目的情况 我试图解决的具体问题是提供一个对象,它可以在jstl中使用c:forEach和${a.b.c}这样的表达式进行迭代。在本例中,我希望${a.b.c}计算c的第一个值(如果没有,则为null),但也能够使用迭代所有c并让循环体依次查看c的每个值,尽管它们在映射中具有相同的键 从方法的角度来看,这应该很简单,只需提供一个Map实现,它的entrySet()方法返回一个集合,其中包含多个具有相同

我想要一张地图,它也是一个收藏。或者更具体地说,我希望能够迭代映射中的条目,包括一个特定键有多个条目的情况

我试图解决的具体问题是提供一个对象,它可以在jstl中使用
c:forEach
${a.b.c}
这样的表达式进行迭代。在本例中,我希望
${a.b.c}
计算
c
的第一个值(如果没有,则为null),但也能够使用
迭代所有
c
并让循环体依次查看
c
的每个值,尽管它们在映射中具有相同的键

从方法的角度来看,这应该很简单,只需提供一个
Map
实现,它的
entrySet()
方法返回一个集合,其中包含多个具有相同键的条目。但既然这似乎违反了地图的契约,事情会以微妙但灾难性的方式破裂吗?还有其他人做过这种事吗

(如果您猜到我正在尝试呈现xml,那么您是对的)

编辑

请注意,这是在jstl中使用的,因此我提供的任何接口都必须满足2个条件:

  • 要与
    []
    运算符一起使用,它必须是
    映射
    列表
    、数组或JavaBeans对象(其中不能是列表或数组,因为索引不是数字)
  • 要与forEach一起使用,它必须是数组、
    集合、
    迭代器、
    枚举、
    映射或
    字符串

因此,我想真正的问题是,我能指望jstl只调用
.containsKey()
.get()
、和
.entrySet()
,而不关心不变量被违反,也不在内部制作映射副本,这样就不会保留特殊的迭代行为。

您正在寻找的是一个新的映射。提供了它的一个实现,特别是您正在寻找的。

我几乎不记得jstl,但您所说的听起来有点争议: 在foreach中:

这里${a.b.c}应该指向某个值容器,然后我们对其进行迭代

另一方面,您说,${a.b.c}“应该计算到c的第一个值”(或null…) 这是一个模棱两可的定义

如果您觉得Multimap不是您想要的,您可以提供自己的集合实现(可能在内部基于Multimap)

作为一个想法,您可以始终将单个元素视为一个列表(这是偶然的) 由一个元素组成)。我想这样你就可以解决你的模棱两可了


我希望这有助于拥有一个
映射
,同一个键有多个条目,这将不可修复地破坏
映射
契约。如果
Multimap
对您不起作用,那么在不破坏很多东西的情况下,就无法做到这一点


具体地说,如果你把你的怪物传递给一个指定用来获取
贴图的东西,它几乎肯定会断裂……听起来这就是你想用它做的,所以是的。

你用一个带有集合的贴图作为值怎么样?然后,可以对同一个键使用不同的值,并且可以通过嵌套的foreach循环对它们进行迭代


您还可以轻松地为现有映射实现编写包装器,如果您需要,它可以为所有值提供一个迭代器

Close,但这与我需要的并不完全一样。我不希望
get()
方法返回所有值的列表,我希望它返回某个定义良好的值(即第一个值)。它看起来也不是一个
映射
,所以如果不在JSTLEL中进行修改,我就不能使用它。它会这样吗?它不符合合同,但我能想到的唯一不变的是它实际上违反了合同∀x∈ Map.entrySet x.getValue==Map.get(x.getKey),如果没有验证,那么谁在乎呢?您将破坏keySet().size()==entrySet().size()的标识。但是您已经提到的不变量实际上是我编写的代码中一个非常常见的假设,它接受映射参数——如果您打破了它,就无法知道所有可能出错的内容。是的,表达式是不明确的,根据上下文的不同有不同的含义。但是我可以在实现中明确地说,字符串值将恰好是第一个值。这整个问题都来自于试图对一个模棱两可的情况做出最好的处理(这意味着定义良好,而不是例外;由于明显的原因,正确性是不可能的)。