将令牌保存到ArraysList并在Java中进行比较

时间:2015-07-01 11:26:02

标签: java arraylist token

我正在研究抄袭检测系统,我需要比较两个字符串并显示相似结果。

我有两个字符串我将它们转换为用空格分隔的标记,现在我想将它们保存在ArrayList中,这样我就可以比较它们并按顺序显示相同索引的结果。

我的源代码是

public static void main(String[] args) {
    // TODO code application logic here

    String str1 = "This is String number one";
    String str2 = "This is String number two";

    StringTokenizer st1 = new StringTokenizer(str1);
    StringTokenizer st2 = new StringTokenizer(str2);

    System.out.println("---Split by space---");
    ArrayList<String> list1 = new ArrayList<String>();

    list1.add(str1);

// was trying to save the tokens in arraylist...

    ArrayList<String> list2 = new ArrayList<String>();
    list2.add(str2);

    for (String number : list1) {
System.out.println("String 1 = " + number);
}
    for (String number : list2) {
System.out.println("String 2 = " + number);
}

}
}

任何建议/示例都会有所帮助。

6 个答案:

答案 0 :(得分:1)

你需要StringTokenizer吗?

 String str1 = "This is String number one";
 String str2 = "This is String number two";

 List<String> list1 = Arrays.asList(str1.split(" "));
 List<String> list2 = Arrays.asList(str2.split(" "));

答案 1 :(得分:1)

如果要将令牌添加到列表中,则必须迭代它们,而不是简单地将StringTokenizer添加到列表中。

例如:

public static void main(String[] args) {

    String str1 = "This is String number one";
    StringTokenizer st1 = new StringTokenizer(str1);
    ArrayList<String> list1 = new ArrayList<String>();

    //Iterate over all tokens and add them to your list
    while (st1.hasMoreTokens()) {
        list1.add(st1.nextToken());
    }

    System.out.println("List 1 tokens: ");
    for (String element : list1) {
        System.out.println("\t" + element);
    }

    System.out.println("There are " + list1.size() + " tokens");
}

输出结果为:

List 1 tokens: 
    This
    is
    String
    number
    one
There are 5 tokens

答案 2 :(得分:1)

此代码段可以帮助您: -

List<String> repetWords = new ArrayList<String>(); 
    String str1 = "This is String number one";
    String str2 = "This is String number two";

    String[] array = str1.split(" ");
    List<String> list = new ArrayList<String>(array.length);
    Collections.addAll(list, array);

    String[] array2 = str2.split(" ");
    List<String> list2 = new ArrayList<String>(array2.length);
    Collections.addAll(list2, array2);

    for (String string : list) {
        if(list2.indexOf(string) != -1){
            repetWords.add(string);
        }
    }
    System.out.println("repeated words in str2");

    for (String rptWords : repetWords) {
        System.out.println(rptWords);
    }
}

答案 3 :(得分:1)

你的代码没有使用字符串tokenizer st1和st2,你正在将strings str1,str2添加到你的arraylistlist。我不知道你试图用代码实现什么,但是从你的评论 “/ /试图在arraylist中保存令牌......“ 然后将字符串添加到列表而不是字符串tokenizer变量中的所有项

更改代码的这一部分

// was trying to save the tokens in arraylist...

    ArrayList<String> list2 = new ArrayList<String>();
    list2.add(str2);

 // was trying to save the tokens in arraylist...  
  ArrayList<String> list2 = new ArrayList<String>();
     while((st2.hasMoreTokens()))//you need to iterate over the string tokens
        list2.add(str2);

答案 4 :(得分:0)

这应该有效:

for (String token1 : list1) {
            for (String token2 : list2) {
                // code to compare two tokens
            }
        }

此外,如果您想比较相同的索引元素,则两个列表应具有相同的大小:

for (int index = 0; index <list1.size(); index++) {
            String token1 = list1.get(index);
            String token2 = list2.get(index);
            // code to compare tokens
        }

答案 5 :(得分:0)

这可以满足您的所有要求,并且还可以处理不同长度的列表:

public class StringTokenCompare {

    void compareStringTokens (String s1, String s2) {
        List <String> l1 = Arrays.asList (s1.split (" "));
        List <String> l2 = Arrays.asList (s2.split (" "));
        Iterator <String> i1 = l1.iterator();
        Iterator <String> i2 = l2.iterator();
        int totalItems = Math.abs (l1.size () - l2.size ());
        int matchCount = 0;
        while (i1.hasNext() && i2.hasNext()) {
            String t1 = i1.next();
            String t2 = i2.next();
            if (t1.equals(t2)) {
                ++matchCount;
            }
        }
        System.out.format ("Tokens in longer line: %d", totalItems);
        System.out.format ("Matching tokens:       %d", matchCount);
    }

}

但是,这些列表可能大小不同的事实应该让您开始思考如果您认真检测抄袭就必须应对的问题。

  1. 如果插入或删除了一个单词,那么它会移动其中一个列表中的单词怎么办?你会在非常相似的线上获得较低的匹配数。
  2. 如果重新排列了单词顺序怎么办?
  3. 我的建议 - 超出了原始问题的范围 - 你应该认真考虑令牌列表之间的编辑距离,而不是逐项比较。 Internet搜索将快速找到一个简单的编辑距离算法。