Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java比较两个列表_Java_List_Comparison_Hashmap - Fatal编程技术网

Java比较两个列表

Java比较两个列表,java,list,comparison,hashmap,Java,List,Comparison,Hashmap,我有两个列表(不是java列表,可以说是两列) 比如说 **List 1** **Lists 2** milan hafil dingo iga iga dingo elpha binga hafil mike meat dingo milan e

我有两个列表(不是java列表,可以说是两列)

比如说

**List 1**            **Lists 2**
  milan                 hafil
  dingo                 iga
  iga                   dingo
  elpha                 binga
  hafil                 mike
  meat                  dingo
  milan
  elpha
  meat
  iga                   
  neeta.peeta    
我想要一个返回多少元素相同的方法。这个例子应该是 3,它应该返回相似的列表值和不同的值

我应该使用hashmap吗?如果是,那么使用什么方法来获得结果

请帮忙


附言:这不是学校的作业:)所以如果你只是指导我,假设
hash1
hash2

List< String > sames = whatever
List< String > diffs = whatever

int count = 0;
for( String key : hash1.keySet() )
{
   if( hash2.containsKey( key ) ) 
   {
      sames.add( key );
   }
   else
   {
      diffs.add( key );
   }
}

//sames.size() contains the number of similar elements.
Listsames=which
列表diff=无论什么
整数计数=0;
for(字符串键:hash1.keySet())
{
if(hash2.containsKey(key))
{
sames.add(key);
}
其他的
{
差异添加(键);
}
}
//size()包含相似元素的数量。
这些是真的(有序的,有重复的),还是真的(无序的,没有重复的)

因为如果是后者,那么你可以使用,比如,a,在预期的线性时间内使用方便的

List list1=Arrays.asList(
“米兰”、“米兰”、“iga”、“野狗”、“米兰”
);
List list2=Arrays.asList(
“哈菲尔”,“米兰”,“野狗”,“肉”
);
//交集
Set intersect=新哈希集(列表1);
相交。保留(列表2);
System.out.println(intersect.size());//打印“2”
System.out.println(相交);//打印“[米兰,野狗]”
//交叉点/并集作为列表
List intersectList=new ArrayList();
intersectList.addAll(列表1);
intersectList.addAll(列表2);
相交列表。保留(相交);
系统输出打印项次(交叉列表);
//打印“[米兰,米兰,野狗,米兰,米兰,野狗]”
//原始列表在结构上没有修改
System.out.println(列表1);//打印“[米兰,米兰,iga,野狗,米兰]”
System.out.println(列表2);//印刷品“[哈菲尔,米兰,野狗,肉]”
编辑

这里有两个版本。一个使用
ArrayList
,另一个使用
HashSet

比较它们并由此创建您自己的
版本,直到您得到所需

这应足以涵盖:

附言:这不是学校的作业:)所以如果你能给我指导就足够了

你问题的一部分

继续原始答案:

为此,您可以使用
java.util.Collection
和/或
java.util.ArrayList

该方法执行以下操作:

仅保留此集合中包含在指定集合中的元素

请参见此示例:

import java.util.Collection;
import java.util.ArrayList;
import java.util.Arrays;

public class Repeated {
    public static void main( String  [] args ) {
        Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"));
        Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo"));

        listOne.retainAll( listTwo );
        System.out.println( listOne );
    }
}
编辑

对于第二部分(类似值),您可以使用以下方法:

删除此集合中也包含在指定集合中的所有元素

第二个版本还提供了类似的值和重复的句柄(通过丢弃它们)

这次
集合
可以是
集合
而不是
列表
(区别在于,集合不允许重复值)

如果它不能完全满足你的需要,它会给你一个良好的开端,让你可以从这里开始

读者的问题:您将如何包含所有重复的值?

您可以尝试从中获取方法

intersection()
方法提供包含公共元素的集合,而
subtract()方法提供所有不常见元素


他们还应该注意类似的元素

我在 此示例首先验证大小,然后检查一个列表中的特定元素在另一个列表中的可用性。

使用java 8 removeIf

public int getSimilarItems(){
    List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta");
    List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection
    int initial = two.size();

    two.removeIf(one::contains);
    return initial - two.size();
}
public int getSimilarItems(){
列表一=数组.asList(“米兰”、“野狗”、“埃尔法”、“哈菲尔”、“肉”、“iga”、“尼塔.皮塔”);
列表二=新的ArrayList(Arrays.asList(“hafil”、“iga”、“binga”、“mike”、“dingo”);//无法直接从数组支持的集合中删除
int initial=2.size();
2.removeIf(1::contains);
返回initial-two.size();
}
公共静态布尔比较列表(列表ls1、列表ls2){
返回ls1.containsAll(ls2)和&ls1.size()==ls2.size()?true:false;
}
公共静态void main(字符串[]args){
ArrayList one=新的ArrayList();
一。添加(“一”);
一.加入(“两”);
一.加入(“六”);
ArrayList two=新的ArrayList();
二、增加(“一”);
二、添加(“六”);
二.加入(“二”);
System.out.println(“Output1::”+compareList(一,二));
二.加上(“十”);
System.out.println(“Output2::”+compareList(一,二));
}

如果您正在寻找一种简便的方法来测试两个集合的相等性,您可以使用
org.apache.commons.collections.CollectionUtils.isEqualCollection
,它比较两个集合,而不考虑其顺序

简单解决方案:-

    List<String> list = new ArrayList<String>(Arrays.asList("a", "b", "d", "c"));
    List<String> list2 = new ArrayList<String>(Arrays.asList("b", "f", "c"));

    list.retainAll(list2);
    list2.removeAll(list);
    System.out.println("similiar " + list);
    System.out.println("different " + list2);

在所有方法中,我发现使用
org.apache.commons.collections.CollectionUtils#isEqualCollection
是最好的方法。以下是原因:

  • 我不必自己申报任何额外的列表/设置
  • 我没有改变输入列表
  • 它非常有效。它检查O(N)复杂度的相等性

如果不能将
apache.commons.collections
作为依赖项,我建议实现它所遵循的算法来检查列表的平等性,因为它的效率很高。

请建议任何数据结构列表不是java列表或hashmap或任何数据结构。请务必考虑在特殊情况下应该做什么。列表可以包含相同的值两次吗?如果是这样,如果“野狗”在两个列表中出现两次,那么这算是两个相同的元素还是只有一个?您可以修改列表中的一个吗?如何编辑??是的,每个列表可以多次包含相似的值。在问题之后,标签下面应该有一个编辑小链接。他想要相同键的列表
$ java Repeated
One:[milan, iga, dingo, iga, elpha, iga, hafil, iga, meat, iga, neeta.peeta, iga]

Two:[hafil, iga, binga, mike, dingo, dingo, dingo]

Similar:[dingo, iga, hafil]

Different:[mike, binga, milan, meat, elpha, neeta.peeta]
public int getSimilarItems(){
    List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta");
    List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection
    int initial = two.size();

    two.removeIf(one::contains);
    return initial - two.size();
}
public static boolean compareList(List ls1, List ls2){
    return ls1.containsAll(ls2) && ls1.size() == ls2.size() ? true :false;
     }

public static void main(String[] args) {

    ArrayList<String> one = new ArrayList<String>();
    one.add("one");
    one.add("two");
    one.add("six");

    ArrayList<String> two = new ArrayList<String>();
    two.add("one");
    two.add("six");
    two.add("two");

    System.out.println("Output1 :: " + compareList(one, two));

    two.add("ten");

    System.out.println("Output2 :: " + compareList(one, two));
  }
    List<String> list = new ArrayList<String>(Arrays.asList("a", "b", "d", "c"));
    List<String> list2 = new ArrayList<String>(Arrays.asList("b", "f", "c"));

    list.retainAll(list2);
    list2.removeAll(list);
    System.out.println("similiar " + list);
    System.out.println("different " + list2);
similiar [b, c]
different [f]