2010-06-03 33 views
0

我有一个类更新属性Java中arraylist的一个元素?

Class TextChunks extends Token { 
    ArrayList<Token> arrt = new ArrayList<Token>(); 
} 

程度氟利昂类:

class Token { 
    String s; 
    int frequency = 1 ;// Tern frequency in TextChunk 
    } 

现在,在令牌我有数组列表令牌,我希望有相同的一个以上的令牌时更新Texchunks令牌的属性频率。

对于显然给出一个例子:

Texchunks:“特别是在结构域和范围在一些”

所以有8令牌:在,特别是,在,域和,范围,在,一些

我想对令牌更新的属性频率:在这个例子中,当我得到属性的标记频率“在”必须返回3

它的意思是,当我打电话:得到Texchunks的频率时dislay:

in 3 
particular 1 
in 3 
domain 1 
and 1 
range 1 
in 3 
some 1 

这里我的代码:

public TextChunks updateFrequencyOfTokenInTextChunks (TextChunks tc) throws CloneNotSupportedException { 
     TextChunks result = (TextChunks) tc.clone(); 

     for (int i =0 ; i< result.arrt.size() ; i++){ 
      int j=i+1; 
      if (result.arrt.get(i).compareTwoToken(result.arrt.get(j))== true) 
      { 
       // help here how to update attribute result.arrt.get(i) 
          // and result.arrt.get(J) = ++ and 
      } 

     } 
     return tc; 

    } 

感谢advandce

这里是方法比较两个令牌

所有的
public boolean compareTwoToken(Token tk){ 
    if(this.s.toLowerCase().trim().equals(tk.s.toLowerCase())) 
     return true; 
    return false; 
} 

回答

2

你不完整的算法不起作用,因为j没有在i以前的位置找到。 一个更多钞票的解决办法是:

  • updateFrequencyOfTokenInTextChunks方法:

    public static void updateFrequencyOfTokenInTextChunks (TextChunks tc) { 
        Hashtable<String,Integer> visited = new Hashtable<String,Integer>(); 
    
        for (Token token : tc.arrt){ 
        if (visited.containsKey(token.s)) { 
         token.frequency = visited.get(token.s); 
        } else { 
         int n = count(token, tc); 
         visited.put(token.s, n); 
         token.frequency = n; 
        } 
        } 
    } 
    

我的解决方案并不返回任何类型的,因为我明白了更新updateFrequencyOfTokenInTextChunks)应修改参数(TextChunks tc)并且不返回克隆。

  • count附配方法:

    private static int count(Token t, TextChunks tc) { 
        int cont = 0; 
        for (Token token : tc.arrt) { 
         if (t.compareTwoToken(token)) { 
          cont++; 
         } 
        } 
        return cont; 
    } 
    

祝你好运!

+0

感谢您的帮助! 问题修复! – tiendv 2010-06-03 09:28:20

1

首先,你的循环被打破微妙。您可以使用:

for (int i =0 ; i< result.arrt.size() ; i++) 

但你在指数i+1(通过j)引用一个项目,所以你已经有一个差一错误。您需要更改循环以达到result.arrt.size()-1。其次,没有必要将布尔值与true进行显式比较;它是多余的,使事情变得不必要的混乱和混乱,一般被认为是不好的风格。第三,除非你打算修改result对象,否则你的克隆是完全不必要和浪费的。现在,为了回答你的问题,节省变量的元素,使您的生活更轻松,然后只更新字段类似如下:

ArrayList<Token> tokens = tc.aart; 
for (int i = 0; i < tokens.size() - 1; i++){ 
    Token current = tokens.get(i); 
    Token next = tokens.get(i+1); 
    if (current.compareTwoToken(next)){ 
     current.frequency = /* new value of frequency */ 
     next.frequency = /* new value of frequency */ 
    } 
} 

不过请注意,由于该领域frequency尚未被声明为public,这需要由具有包权限的代码执行。另外,你参考compareTwoToken,但在你发布的片段中,你不提供这样的功能。

+0

感谢您的依靠: 我已经添加methor比较两个令牌! – tiendv 2010-06-03 08:59:01

0

您可以使用此代码

import java.util.ArrayList; 

import java.util.Arrays; 

import java.util.LinkedHashSet; 

import java.util.List; 

import java.util.Set; 

import java.util.regex.Matcher; 

import java.util.regex.Pattern; 


public class TokenFrequency { 

    public static void main(String[] args) { 
     String text = "in particular in domain and range in some"; 
     String[] tokens = text.split(" "); 
     System.out.println(Arrays.toString(tokens)); 
     Set<String> uniqueTokens = new LinkedHashSet<String>(Arrays.asList(tokens)) ; 
     List<Token> list = new ArrayList<Token>(); 


     for(String uniqueToken : uniqueTokens){ 
      String regex = "\\b" + uniqueToken + "\\b"; 
      Pattern pattern = Pattern.compile(regex); 
      Matcher matcher = pattern.matcher(text); 
      int frequency = 0; 
      while (matcher.find()) { 
       frequency++; 
      } 
      Token token = new Token(); 
      token.frequency = frequency; 
      token.s = uniqueToken; 
      list.add(token); 
     } 

     System.out.println(list); 

    } 



} 
+0

感谢您的依赖,但我不想删除texchunk中的令牌 – tiendv 2010-06-03 09:10:53

0

这里词的频率是它在句子中出现的次数。 您可以使用一个小代码为

 String sent ="in particular in domain and range in some"; 
    StringTokenizer str = new StringTokenizer(sent, " "); 
    ArrayList<String> list = new ArrayList<String>(); 
    while(str.hasMoreTokens()){ 
     //System.out.println(str.nextToken()); 
     list.add(str.nextToken()); 
    } 

上面的代码只是为了让特定的词,你在用自己的方式做了。下面 的代码是在寻找frquency有所帮助:

HashSet<String> st = new HashSet<String>(); 
     st.addAll(list); 
     ArrayList<Token> arrt = new ArrayList<Token>(); 
     for(String s:st){ 
      Token token = new Token(); 
      token.s=s; 
     token.frequency=Collections.frequency(list, s); 
     arrt.add(token); 
     } 

因此Collections.frequency()方法会给你每个单词的频率集合英寸

相关问题