【问题标题】:How do I combine a subList and a Hashset (ArrayList)?如何组合子列表和哈希集(ArrayList)?
【发布时间】:2016-03-14 02:24:22
【问题描述】:

我正在制作一个包含 3 种不同类型组的 ArrayList。我想要达到的目标是:

  1. 确保随机化(Collections.shuffle)(完成)
  2. 使用子列表,我可以在 ArrayList 中选择特定数量的元素(完成)
  3. 为防止运行程序时其他组出现重复,我实现了一个 HashSet(未完成)

我似乎无法将#2 和#3 结合起来。也许我只是不明白 HashSets 是如何完成的。这是我的代码:

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]

Randomization to Randomize,SubList 选择特定数组并打印它们,HashSet 防止重复。

请记住,这只是 1 周,现在我必须找到一种方法让它重现,以便每个国家/地区至少在 5 周内举行一次会议 -_- 帮助/建议/示例很感激,但弄清楚这一点是我的主要目标。

【问题讨论】:

    标签: java arraylist hashset sublist


    【解决方案1】:

    如果列表中成员的类型只是字符串,那么您的代码运行良好,我对其进行了测试。但是如果你想避免重复的自定义类,你需要重写equals()和hashCode()方法。您应该阅读有关如何确保已正确实现 equals 和 hashCode 的内容。这是一个很好的起点:What issues should be considered when overriding equals and hashCode in Java?

    【讨论】:

      【解决方案2】:
      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");
      
      }
      

      【讨论】:

      • 我理解它是如何工作的......但它并没有像我想要的那样打印出一个组。我花了整整一个小时来搞乱你提供给我的方法来添加一个 subList 但没有运气,所以回到我原来的问题。
      • @GalcticFragility 抱歉!我刚刚编辑了我的代码 sn-p 并将“allCountries.add(...)”添加到第 5 行。这将给定的国家添加到 HashSet,它代表已添加到任何列表中的所有国家的宇宙。我还在中间添加了一行,我试图将“美国”添加到列表“二”中,即使它已经添加到列表“一”中。因为在 helper 方法中有一个检查来查看该国家/地区是否已经添加到之前的列表中,所以它最终没有被添加到列表“两个”中(如最后的打印语句中所观察到的)。
      • 这很有意义。我已经编辑了底部的 3 System.out 并将它们更改为子列表(请参阅上面我在底部的主代码中所做的评论,其中包含 3 个组),就像我想要的那样。它在我的目标列表中实现了#2(现在我如何放置 2 个组?,也许添加一个 for 或其他方法?)但是因为我也发现很难实现随机化,因为散列创建了一个阻止它的墙, #1 被扔出窗外,#3 sorta 实现了我想要的(谢谢),但我只想要 3 个组来完成我的预期输出。继续运行我的主要代码 2 看看 whtimn
      • 只是回顾一下,请在那里实现随机化。不要打印出整个列表,而是像我的主代码中的那样更改为子列表。请帮助我打印出其他组。我想要的只是 3 个不断随机化的组,因此当它运行时会出现不同的结果,而不是出现在有序列表中。它没有欺骗,这是我的预期输出。请在没有 cmets 的情况下运行我的主要代码,看看我的意思
      猜你喜欢
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多