有没有办法在java中无限循环遍历Map元素?

时间:2016-03-04 15:39:37

标签: java dictionary

假设我有一个包含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次访问地图。 nm之间没有任何关系。每次我访问一个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到值。

以循环次序继续迭代地图,直到达到特定条件。

3 个答案:

答案 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

无关的顺序
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循环并且满足退出条件。