【问题标题】:how to iterate over a growing set in java如何在java中迭代一个不断增长的集合
【发布时间】:2018-10-26 19:38:57
【问题描述】:

我有一些 c++ 代码,其中迭代了一个集合,每个循环都在增长。

示例 c++ 代码如下。 如何在java中编写相同的代码?

#include <bits/stdc++.h>
using namespace std;

#define tr(c,i) for(auto i=(c).begin(); i != (c).end(); i++)
#define rep(i,n) for(int i=0;i<(n);i++)
#define forup(i,a,b) for(int i=(a);i<=(b);i++)
#define tcsolve() int tcs; cin >> tcs; forup(tc, 1, tcs) solve();

void solve() {
    int n, k, t, ans;
    cin >> n >> k;
    set<int> s, w;
    rep (i, n) {
        cin >> t;
        s.insert(t);
    }
    ans = k;
    w.insert(k);
    tr(s, i) {
        tr(w, j) {
            int x = *i^*j;
            ans = max(ans, x);
            w.insert(x);
        }
    }
    cout << ans << endl;
}

int main () {
    std::ios::sync_with_stdio(false);
    tcsolve();
    return 0;
}

我想在java中做同样的事情

tr(w, j) {
    int x = *i^*j;
    ans = max(ans, x);
    w.insert(x);
}

我该怎么做?

我的解决方案是这样的

static int findMaximum(Set<Integer> set, int k) 
    {
        int ans = k;
        Set<Integer> temp = new HashSet<>();

        temp.add(k);

        Iterator<Integer> iter_i = set.iterator();
        Iterator<Integer> iter_j = temp.iterator();

        int i,j=0;
        while(iter_i.hasNext())
        {
            i = (int)iter_i.next();
            while(iter_j.hasNext())
            {
                j = (int)iter_j.next();
                int x = i^j;
                ans = Integer.max(ans, x);
                temp.add(x);
            }
            System.out.println("temp: " +temp);
            System.out.println("i: " + i +" j: " +j);
        }

        return ans;

    }

但我的实际答案是

temp: [4, 5]
i: 1 j: 4
temp: [4, 5]
i: 2 j: 4
temp: [4, 5]
i: 3 j: 4
5

在正确的解决方案中,该集合应该随着方法的返回值而增加,如7

如果我的问题还有其他错误请指出

【问题讨论】:

  • 从问题中不太清楚您到底要做什么。请详细说明。
  • 是的,存在基本错误。在 Java 中,您不能在迭代时向 Collection 中添加或删除元素(HashSet 就是其中之一)。它抛出并发修改异常。
  • @Vadim 不一定。取决于集合类型、迭代器类型以及添加方式。
  • 关于 C++ 代码的注释。如果您在阅读时遇到困难,请不要感到难过。它遵循不建议专业编程使用降低可读性和可移植性的习语。从算法中学习你能学到什么,但不要写这样的代码。

标签: java c++ iterator set hashset


【解决方案1】:

您不应该重新实现它。你可以使用 Java Streams,他们已经实现了。

这只是一个例子:

Integer maxNumber = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
                    .max(Comparator.comparing(Integer::valueOf)).get();
Integer minNumber = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
                    .min(Comparator.comparing(Integer::valueOf)).get();

System.out.println("maxNumber = " + maxNumber);
System.out.println("minNumber = " + minNumber);

从集合创建流:

Set<Integer> s = ...
Integer max = s.stream().max(Comparator.comparing(Integer::valueOf)).get();

【讨论】:

    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多