обновить атрибут элемента в arraylist на java? - PullRequest
0 голосов
/ 03 июня 2010

У меня есть класс

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

класс фронта экстента:

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

Теперь в токене у меня есть токен Arraylist, я хочу обновить частоту атрибута токена в Texchunks, когда есть большечем один токен один и тот же.

Для наглядного примера приведите пример:

Texchunks: "в частности, в области и диапазон в некоторых"

Так что есть 8 токенов: в частности,, 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 ]

2 голосов
/ 03 июня 2010

Ваш неполный алгоритм не работает, потому что 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;
    }
    

Удачи!

1 голос
/ 03 июня 2010

Прежде всего, ваш цикл слегка нарушен.Вы используете:

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

Но затем вы ссылаетесь на элемент с индексом i+1 (через j), так что у вас уже есть ошибка «по одному».Вам нужно изменить цикл до result.arrt.size()-1.Во-вторых, нет необходимости явно сравнивать логическое значение с истинным;это избыточно и делает вещи ненужными, беспорядочными и запутанными и обычно считается плохим стилем.В-третьих, если вы не планируете модифицировать объект 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, это должно быть выполнено кодом, который имеет пакетный доступ к классу Token.Кроме того, вы ссылаетесь на compareTwoToken, но в опубликованном вами фрагменте вы не предоставляете такую ​​функцию.

0 голосов
/ 03 июня 2010

Здесь частота слова - это количество раз, которое оно присутствует в предложении. Вы можете использовать небольшой код для этого

     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 () даст вам частоту каждого слова в коллекции.

0 голосов
/ 03 июня 2010

Вы можете использовать этот код

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

    }



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...