更新属性java中的arraylist中的元素?

时间:2010-06-03 07:57:05

标签: java

我有一个班级

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

范围fron class:

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

现在在令牌中我有arraylist令牌,我想在多个令牌相同的情况下更新Texchunks中令牌的属性频率。

显然,举个例子:

Texchunks:“特别是在某些领域和范围内”

所以有8个令牌:in,特别是in,domain,和range,in,some

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

这意味着当我打电话时:在发布时获得Texchunks的频率:

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;
}

4 个答案:

答案 0 :(得分: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;
        }
      }
    }
    

我的解决方案没有返回任何类型,因为我理解 update 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;
    }
    
祝你好运!

答案 1 :(得分: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尚未公开,因此需要由具有对Token类的包访问权限的代码执行。另外,您引用了compareTwoToken,但在您发布的代码段中,您没有提供此类功能。

答案 2 :(得分: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);

    }



}

答案 3 :(得分: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());
    }

上面的代码只是为了得到你所做的特别的话。 下面的代码有助于找到频率:

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()方法将为您提供集合中每个单词的频率。