2015-07-01 41 views
1
比較各

我正在抄襲檢測系統的工作,我需要比較兩個字符串,並顯示了相似的結果。保存令牌到ArraysList和Java中

我有兩個字符串我已經轉換他們與空格分隔標記,現在我想將它們保存在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); 
} 

} 
} 

任何建議/例子將是有益的。

+2

OK中的所有項目,那麼什麼是你的問題,特別是? –

+0

因此,基本上你想要比較list1和list2中的x位置元素,並將其存儲到與x相同索引的第三個列表中?是否? – pcj

+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(" ")); 
+0

我同意; StringTokenizer是矯枉過正。 –

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 
     } 
+0

嵌套for循環的頂部塊嚴重錯誤。它會將第一個列表中的項目0與第二個列表中的* every *項目進行比較。然後它會比較第一個列表中的第一個項目和第二個列表中的* every *項目。並且假設兩個列表將會是相同的長度,非常幼稚,導致代碼變得脆弱。 –

+0

@嚴酷的蝌蚪15這是我的意圖,他可能需要比較每個元素與其他列表的元素。 – pcj

+0

好的。但是,考慮到原始問題中代碼所展現的專業水平,您的回答可能值得一提。沒有解釋,原始的海報可能無法提取你想要的內容。 –

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 
+0

griFlo也發佈了一個很好的答案。請記住,java.util.Arrays.ArrayList和java.util.ArrayList不一樣。 – DeiAndrei

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); 
    } 
} 
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. 如果單詞順序已重新排列,該怎麼辦?

我的建議 - 當然之外的原始問題的範圍 - 是你應該認真考慮的記號列表,而不是一個天真的項目,通過項目之間比較編輯距離。互聯網搜索將快速找到一個簡單的編輯距離算法。

1

你的代碼不使用字符串斷詞ST1和ST2,要添加字符串STR1,STR2您arraylistlist.I我不知道該怎麼烏爾努力實現的代碼,但是從烏爾評論「//試圖在ArrayList中保存令牌...「,然後添加字符串列表,而不是字符串標記變量

更改這部分代碼的

// 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);