Java 如何组合子列表和哈希集(ArrayList)?

Java 如何组合子列表和哈希集(ArrayList)?,java,arraylist,hashset,sublist,Java,Arraylist,Hashset,Sublist,我正在制作一个包含3种不同类型组的ArrayList。我努力实现的目标是: 它确保了随机化(Collections.shuffle)(完成) 使用子列表,我可以在ArrayList中选择特定数量的元素(完成) 为了防止在运行程序时在其他组中出现重复,我实现了一个HashSet(notdone) 我似乎不能把二和三结合起来。也许我还不明白哈希集是如何完成的。这是我的密码: class code { public static void main(String[] args) {

我正在制作一个包含3种不同类型组的ArrayList。我努力实现的目标是:

  • 它确保了随机化(Collections.shuffle)(完成)
  • 使用子列表,我可以在ArrayList中选择特定数量的元素(完成)
  • 为了防止在运行程序时在其他组中出现重复,我实现了一个HashSet(notdone)
  • 我似乎不能把二和三结合起来。也许我还不明白哈希集是如何完成的。这是我的密码:

    class code {
        public static void main(String[] args) {
    
        //This is creating the ArrayList with everything added
    
        List one = new ArrayList();
        List two = new ArrayList();
        List three = new ArrayList();
    
        one.add("United States");
        one.add("United Kingdom");
        one.add("Italy");
        one.add("France");
        one.add("Russia");
        one.add("Japan");
        one.add("China");
        one.add("Mexico");
    
        two.add("Philippines");
        two.add("Austria");
        two.add("Canada");
        two.add("Sweden");
        two.add("Iceland");
        two.add("India");
        two.add("Australia");
        two.add("Deutschland");
    
        three.add("Norway");
        three.add("Kosovo");
        three.add("North Korea");
        three.add("Sudan");
        three.add("United Arab Emirates");
        three.add("Bahrain");
        three.add("Haiti");
    
        //Formatting purposes
    
        System.out.println("Country Categories: ");
        System.out.println("#1 Countries = " + one);
        System.out.println("#2 Countries = " + two);
        System.out.println("#3 Countries = " + three);
        System.out.println("\n");
    
        //Randomization code. I use this method so it's shuffled the same way.
    
        long seed = System.nanoTime();
        Collections.shuffle(one, new Random(seed));
        Collections.shuffle(two, new Random(seed));
        Collections.shuffle(three, new Random(seed));
    
        System.out.println("Group #1");
        List largelist = one.subList(1,4);
        System.out.println(largelist);
        List mediumlist = two.subList(1,4);
        System.out.println(mediumlist);
        List smalllist = three.subList(1,3);
        System.out.println(smalllist);
    
        /*System.out.println("Group #2");
        List largerlist = one.subList(1,4);
        System.out.println(largerlist);
        List mediumrlist = two.subList(1,4);
        System.out.println(mediumrlist);
        List smallrlist = three.subList(1,3);
        System.out.println(smallrlist);
    
        System.out.println("Group #3");
        List largerrlist = one.subList(1,3);
        System.out.println(largerrlist);
        List mediumrrlist = two.subList(1,3);
        System.out.println(mediumrrlist);
        List smallrrlist = three.subList(1,3);
        System.out.println(smallrrlist);*/
        }
    } //I only put one group because of issue I am having
    
    我没有在这里实现我的HashSet,因为它看起来很尴尬,但这里是:

    System.out.println("Group #1");
    Set largeset = new HashSet(one);
    for (Object wow : one) {
      List largelist = one.subList(1,4);
      System.out.println(largelist);
      System.out.println(wow);
    
    我想要的预期输出如下:

    Group #1 //Week 1
    [United Kingdom, Italy, Russia]
    [Philippines, Canada, Iceland]
    [Bahrain, Sudan]
    
    Group #2
    [France, United States, Japan]
    [Sweden, India, Austria]
    [Kosovo, North Korea]
    
    Group #3
    [Mexico, China]
    [Australia, Deutschland]
    [United Arab Emirates, Norway]
    
    随机化用于随机化,子列表用于选择特定数组并打印它们,哈希集用于防止重复


    请记住,这只适用于1周,现在我必须找到一种方法让它再次出现,这样每个国家每5周至少开会一次-u-帮助/建议/示例非常感谢,但弄清楚这一点是我的主要目标。

    如果列表中的成员类型只是字符串,那么您的代码运行良好,我将对其进行测试。但如果要避免重复的自定义类,则需要重写equals()和hashCode()方法。您应该仔细阅读如何确保正确实现了equals和hashCode。这是一个很好的起点:

    我了解它的工作原理。。。但它并没有像我希望的那样打印出一组。我花了整整一个小时来搞乱你提供给我的添加子列表的方法,但运气不好,所以回到我原来的问题上来。@GalcticFragility很抱歉!我刚刚编辑了我的代码片段,并在第5行添加了“allCountries.add(…)”。这会将给定的国家添加到哈希集,哈希集表示已添加到任何列表中的所有国家的范围。我在中间添加了一行,试图添加“美国”来列出“两个”,即使它已经被添加到“一个”列表中,因为在帮助者方法中有一个检查,看看这个国家是否已经被添加到前一个列表中,它最终没有被添加到列表“两个”(如在末尾的打印语句中观察到的)。.这很有道理。我已经编辑了底部的3 System.out并将其更改为子列表(参考我在底部的主代码中对3个组所做的注释),就像我预期的那样。它在我的目标列表中实现了2(现在我如何放置2个组?,可能添加了for或其他方法?),但由于散列创建了一堵墙阻止它,我也发现很难实现随机化,#1被扔出窗口,#3 sorta实现了我想要的(Thx)但我只想要3组能完成我的预期输出。继续并运行我的主代码2。请在这里实现随机化。与打印整个列表不同,请更改为子列表,如我的主代码中的子列表。请帮我把其他组打印出来。我想要的是3组不断随机分组,这样当它运行时,不同的结果就会出现,而不是出现在一个有序的列表中。它不会复制,这是我的预期输出。请运行我的主代码和注释,看看我的意思
    private static Set allCountries = new HashSet();
    
    private static void distinctAdd(String country, List targetList){
        if(!allCountries.contains(country)){
            allCountries.add(country);
            targetList.add(country);
        }else{
            //don't add duplicates!
        }
    }
    
    public static void main(String args[]) {
    
        List one = new ArrayList();
        List two = new ArrayList();
        List three = new ArrayList();
    
        distinctAdd("United States", one);
        distinctAdd("United Kingdom", one);
        distinctAdd("Italy", one);
        distinctAdd("France", one);
        distinctAdd("Russia", one);
        distinctAdd("Japan", one);
        distinctAdd("China", one);
        distinctAdd("Mexico", one);
    
        distinctAdd("Philippines", two);
        distinctAdd("Austria", two);
        distinctAdd("Canada", two);
        distinctAdd("Sweden", two);
        distinctAdd("Iceland", two);
        distinctAdd("India", two);
        distinctAdd("Australia", two);
        distinctAdd("Deutschland", two);
        distinctAdd("United States", two);
    
        distinctAdd("Norway", three);
        distinctAdd("Kosovo", three);
        distinctAdd("North Korea", three);
        distinctAdd("Sudan", three);
        distinctAdd("United Arab Emirates", three);
        distinctAdd("Bahrain", three);
        distinctAdd("Haiti", three);
    
        System.out.println("Country Categories: ");
        System.out.println("#1 Countries = " + one);
        System.out.println("#2 Countries = " + two);
        System.out.println("#3 Countries = " + three);
        System.out.println("\n");
    
    }