我有一节课
Class TextChunks extends Token {
ArrayList<Token> arrt = new ArrayList<Token>();
}来自类的范围:
class Token {
String s;
int frequency = 1 ;// Tern frequency in TextChunk
}现在,在token中,我有arraylist令牌,当有多个相同的令牌时,我想要更新Texchunks中token的属性频率。
请给出一个清楚的例子:
Texchunks :“特别是在某些领域和范围”
因此有8个标记: in,in,domain,and,range,in,some
我想要更新令牌的属性频率:在本例中,当我获得令牌的属性频率时," in“必须返回3
意思是当我调用:当dislay时获取Texchunk的频率:
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;
}下面是比较两个令牌方法
public boolean compareTwoToken(Token tk){
if(this.s.toLowerCase().trim().equals(tk.s.toLowerCase()))
return true;
return false;
}发布于 2010-06-03 17:00:26
您的不完整算法不起作用,因为j在i的前一个位置找不到。一个可行的解决方案可能是:
updateFrequencyOfTokenInTextChunks方法:public static void (TextChunks tc) { Hashtable visited =新的Hashtable();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),而no返回克隆。
count辅助方法:私有静态整数计数(Token t,TextChunks tc) { int cont = 0;for ( token token: tc.arrt) { if ( t.compareTwoToken(token) ){ cont++;}} return cont;}
祝好运!
发布于 2010-06-03 16:18:01
首先,你的循环被巧妙地打破了。您可以使用:
for (int i =0 ; i< result.arrt.size() ; i++ )但是,如果您(通过j)在索引i+1处引用了一个项,那么就已经有了一个off-by-one错误。您需要更改循环才能转到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尚未声明为公共字段,因此需要由对Token类具有包访问权限的代码执行此操作。此外,您引用了compareTwoToken,但是在您发布的代码片段中,您没有提供这样的函数。
发布于 2010-06-03 16:20:47
您可以使用以下代码
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);
}
}https://stackoverflow.com/questions/2964150
复制相似问题