假设我有一个包含m
元素的地图,如下所示。
Map<String,Integer> mp = new HashMap<String,Integer>();
mp.put("Delhi",1);
mp.put("Bombay",1);
mp.put("Bangalore",1);
此处m = 3
。我希望以循环顺序访问上述元素的地图特定次数n
,其中n
!= m
。每次我访问Map
时,我都希望获得Map
中的“next”元素(这意味着Map
条目以某种方式排序)。如果我到达Map
的末尾,我想在一开始就重新开始,因为我希望在所有情况下都能完全n
次访问地图。 n
和m
之间没有任何关系。每次我访问一个map元素时,我都希望将该元素的值增加1。
例如,鉴于上述Map
包含3个元素(m == 3
),并假设我想要总共访问Map
五次(n == 5
)。应该发生以下情况:
步骤 - &GT;字符串(键) - &GT;整数(值)
1 - &GT;德里 - →2
2 - &GT;孟买 - →2
3 - &GT;班加罗尔 - →2
4 - &GT;德里 - →3
5 - &GT;孟买 - →3
对此的任何建议都会受到赞赏,甚至也会改变DataStructure。
我特意想要与外部循环串联遍历地图元素。
我不想要的:假设我有一个for循环说
for(1 to numberofcycles)
{
for(iterate-->mapelements)
{
//looping mapelements
}
}
我会遍历地图numberofcycles
* numberofmap
元素,这不是我期望实现的。
相反,我希望以循环顺序循环遍历mapelements
以确切numberofcycles
,并在每次访问后更改/添加1到值。
即
以循环次序继续迭代地图,直到达到特定条件。
答案 0 :(得分:1)
Map<String,Integer> mp = new HashMap<String,Integer>();
mp.put("Delhi",1);
mp.put("Bombay",1);
mp.put("Bangalore",1);
for (int i = 0 ; i < numberOfCycles; i++){
for (String key : mp.keySet()){
mp.put(key,mp.get(key)+1);
}
}
答案 1 :(得分:1)
根据我的理解,您希望总共n
次旅行,每次旅行到不同的目的地,并且您以预定义的顺序访问这些目的地。这样的事情怎么样......
Map<String,Integer> mp = new HashMap<>();
mp.put("Delhi",1);
mp.put("Bombay",1);
mp.put("Bangalore",1);
int numberOfTrips = 5;
List<String> orderOfVisits = Arrays.asList("Delhi", "Bombay", "Bangalore");
Iterator<String> visiterator = orderOfVisits.iterator();
for (int i = 0; i < numberOfTrips; i++) {
// Get a new iterator if we've exhausted the previous one
if (!visiterator.hasNext()) {
visiterator = orderOfVisits.iterator();
}
// Get the correct city and increment the counter
String key = visiterator.next();
mp.put(key, mp.get(key) + 1);
}
// demonstrate that the map contains the correct values
for (Entry<String, Integer> entry: mp.entrySet()) {
System.out.println("Key:" + entry.getKey() + ", Value:" + entry.getValue());
}
要按照添加到Map
的顺序访问城市,您可以执行以下操作:
1)将mp
的声明从HashMap
更改为LinkedHashMap
:
Map<String,Integer> mp = new LinkedHashMap<>();
2)迭代Map
:
visiterator = mp.keySet().iterator();
1)将mp
的声明更改为TreeMap
,并提供比较器:
Map<String,Integer> map = new TreeMap<>(Comparator.naturalOrder());
2)迭代Map
的密钥集,如上例所示。
public static void tripsInConfigurableOrder() {
Map<String, Integer> mp = new HashMap<String, Integer>();
mp.put("Delhi", 1);
mp.put("Bombay", 1);
mp.put("Bangalore", 1);
int numberOfTrips = 5;
List<String> orderOfVisits = Arrays.asList("Delhi", "Bombay", "Bangalore");
Iterator<String> visiterator = orderOfVisits.iterator();
for (int i = 0; i < numberOfTrips; i++) {
if (!visiterator.hasNext()) {
visiterator = orderOfVisits.iterator();
}
String key = visiterator.next();
mp.put(key, mp.get(key) + 1);
}
for (Entry<String, Integer> entry : mp.entrySet()) {
System.out.println("Key:" + entry.getKey() + ", Value:" + entry.getValue());
}
}
public static void tripsInNaturalOrder() {
Map<String, Integer> mp = new LinkedHashMap<>();
mp.put("Delhi", 1);
mp.put("Bombay", 1);
mp.put("Bangalore", 1);
int numberOfTrips = 5;
Iterator<String> visiterator = mp.keySet().iterator();
for (int i = 0; i < numberOfTrips; i++) {
if (!visiterator.hasNext()) {
visiterator = mp.keySet().iterator();
}
String key = visiterator.next();
mp.put(key, mp.get(key) + 1);
}
for (Entry<String, Integer> entry : mp.entrySet()) {
System.out.println("Key:" + entry.getKey() + ", Value:" + entry.getValue());
}
}
public static void usingComparator() {
Map<String, Integer> mp = new TreeMap<>(Comparator.naturalOrder());
mp.put("Delhi", 1);
mp.put("Bombay", 1);
mp.put("Bangalore", 1);
int numberOfTrips = 5;
Iterator<String> visiterator = mp.keySet().iterator();
for (int i = 0; i < numberOfTrips; i++) {
if (!visiterator.hasNext()) {
visiterator = mp.keySet().iterator();
}
String key = visiterator.next();
mp.put(key, mp.get(key) + 1);
}
for (Entry<String, Integer> entry : mp.entrySet()) {
System.out.println("Key:" + entry.getKey() + ", Value:" + entry.getValue());
}
}
public static void main(String[] args) {
tripsInConfigurableOrder();
tripsInNaturalOrder();
usingComparator();
}
答案 2 :(得分:0)
如何使用while循环并将迭代放在像这样的while循环中?
Map<String, Integer> map = ...
while (true or some condition)
{
for (Map.Entry<String, Integer> entry : map.entrySet())
{
map.put(key, map.get(key) + 1);
}
if (some condition met)
some condition = false
}
修改
我阅读了您编辑的帖子,这是您想要做的解决方案。
到达maxCycle时,可以使用break
退出for循环。
Map<String, Integer> map = ...
int numberOfCycles = 0;
int maxCycle = 10;
while (numberOfCycles < maxCycle)
{
for (Map.Entry<String, Integer> entry : map.entrySet())
{
if (++numberOfCycles < maxCycle)
map.put(key, map.get(key) + 1);
else
break;
}
}
假设您从0开始并且maxCycle是5.如果您已经迭代了5次,它将转到else并调用break
。在break
之后,您将返回while循环并且满足退出条件。