【问题标题】:Compare two arraylists with contains instances of classes将两个数组列表与包含类的实例进行比较
【发布时间】:2013-09-13 11:31:10
【问题描述】:

我想比较两个包含两个单独类的实例的数组列表。

例如: 第一名:HKY SGP 15:00 3 20:20 700

第二名:1 HKY SGP 8:00

所以如果第一个列表包含单词 HKY 和 SGP,则需要返回值 700。 这两个都在一个单独的类中进行比较,称为成本。我使用 main 方法将数组列表传递给这个成本类。然后这个成本类继续比较数组列表。

我尝试过的: 我用谷歌搜索了这个问题并尝试使用他们提供的一些解决方案。 我试过使用包含或相等。它给了我一个不正确的值。

然后我尝试使用两个类的 get 方法进行比较。它也没有提供所需的输出。

我认为我对这两个对象的比较都不正确,不知道如何比较。有人能解释一下如何比较数组列表中的这些对象吗?

谢谢!

主代码:

    ArrayList<planes> air = new ArrayList<>();
    ArrayList<questions> q = new ArrayList(); // same as below for questions

    Scanner sc = new Scanner(System.in);
    num = sc.nextInt();


    for (int i=0; i<num; i++){  
       planes p = new planes();

       p.setfrom(sc.next());
       p.setTo(sc.next());
       p.setdT(sc.next());
       p.setaD(sc.next());
       p.setaT(sc.next());
       p.setCt(sc.next());
       air.add(p);


    }

【问题讨论】:

  • 你能把你的代码贴出来让我们看看
  • 如何使用面向对象,而不是使用不同字符串的列表,创建一个包含这些字符串并可以与该类的另一个实例进行比较的类?
  • if (list1.contains("HGY") && list1.contains("SGP") && list2.contains("HGY") && list2.contains("SGP")) { return 700; }
  • @RyanHurling 发布了我的一小部分代码,其余的只是 getter 和 setter
  • @SpongeBobFan 我希望将两个列表相互比较,因此如果列表 1 包含列表 2 中的值,则将输出 700

标签: java arraylist


【解决方案1】:

写一个自定义的Comparator&lt;T&gt; 来做你需要的。

也许两者的正则表达式都可以:

// two Strings both contain "foo"
return x.matches("[foo]") && y.matches("[foo]");

如果正则表达式做不到,请实现您自己的 Knuth-Morris-Pratt 匹配器:

http://www.ics.uci.edu/~eppstein/161/960227.html

【讨论】:

    【解决方案2】:

    您可以实现Comparator&lt;T&gt;。所以实现接口必须重写它的compare(T arg0, T arg1) 方法。在 T,您可以输入任何类型进行比较。像ArrayList(), Class, String 等。并检查字符串是否包含HKY SGP;如果这些总是相邻的,那么你可以直接这样做:

    public int compare(String list1, String list2) {
    
        return list1.contains("HKY SGP") && list2.contains("HKY SGP") ? 700 : 0;
    }
    

    如果两个字符串都包含“HKY SGP”,则返回 700,否则返回 0。

    如果“SGP”并不总是在“HKY”之后,那么只需检查它们中的每一个。比如:

    return list1.contains("HKY") && list1.contains("SGP") && list2.contains("HKY") && list2.contains("SGP") ? 700 : 0;
    

    【讨论】:

    • 谢谢 :) 但是,我想比较两个列表,所以如果列表 1 包含列表 2 中的值,那么将输出 700。
    • 所以你是说你在比较 "air" 和 "q" ?但实际上,您必须将 planes 的某些属性(例如 string / getFrom())与 questions 的某些属性(例如 string)进行比较,然后返回 700 对吗?如我错了请纠正我。为此,您可以从列表中获取特定位置和该位置的类,并将它们传递给它的一些属性。如果我是对的,请告诉我,以便我们讨论如何比较两个差异类。也让我知道 questions 类中有哪些变量。
    • 是的,你是对的。目前,我已经在成本方法中完成了此操作,以检查 i 值是否正确传递,for(int i=0; i
    • 这主要是因为您的列表 air 与列表 q 的大小不同。假设 air.size()3 并且 q.size()1。然后在 for 循环中进行迭代,q.get(0) 将在大小为 1 时工作,但对于 q.get(1 or 2) 将像 一样崩溃>air.size()3 q 只持有一个班级。这就是为什么你得到 IndexOutOfBoundsException
    • 欢迎,如果这是您要搜索的内容,请接受答案。
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 2019-08-11
    • 2021-12-18
    • 1970-01-01
    • 2011-07-01
    • 2019-08-05
    • 2021-05-17
    • 2015-08-31
    相关资源
    最近更新 更多