2010-06-03 7 views
0

J'ai une classemettre à jour un attribut dans arraylist sur java?

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

mesure classe Fron:

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

Maintenant en signe j'ai jeton arraylist, je veux mettre à jour la fréquence d'attribut de jeton dans Texchunks quand ont plus d'un tokens mêmes.

Pour clairement donner un exemple:

Texchunks: « en particulier dans le domaine et dans certains »

donc avoir jeton 8: en, notamment, dans, domaine, et, plage, dans, certains

je veux mettre à jour la fréquence d'attribut pour jeton: dans cet exemple quand je reçois attribuer la fréquence de jeton « dans » doit retourner 3

ce que cela signifie quand je l'appelle: obtenir la fréquence de Texchunks quand dislay:

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

ici mon code:

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; 

    } 

Merci à advandce

Voici la méthode comparer deux jetons

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

Répondre

2

Votre algorithme incomplet ne fonctionne pas parce que j ne trouve pas en position antérieure de i. Une solution pourrait être posible:

  • updateFrequencyOfTokenInTextChunks méthode:

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

Ma solution ne retourne pas tout type, parce que je comprends la mise à jour (updateFrequencyOfTokenInTextChunks) devrait modifier le paramètre (TextChunks tc) et pas de retour un clone.

  • count méthode Auxiliar:

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

Bonne chance!

+0

Merci pour votre aide! problème de réparation! – tiendv

1

Tout d'abord, votre boucle est subtilement cassé. Vous utilisez:

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

Mais vous faites référence à un élément à l'index i+1 (par j), alors vous avez déjà une erreur hors par un. Vous devez changer la boucle pour aller jusqu'à result.arrt.size()-1. Deuxièmement, il n'est pas nécessaire de comparer explicitement une valeur booléenne à true; il est redondant et rend les choses inutiles encombrées et déroutantes et est généralement considéré comme un style pauvre. Troisièmement, à moins que vous ne projetiez de modifier l'objet result, votre clonage est complètement inutile et inutile. Maintenant, pour répondre à votre question, enregistrez les éléments variables pour vous rendre la vie plus facile, et puis juste mettre à jour le champ comme ce qui suit:

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 */ 
    } 
} 

Notez cependant que depuis le domaine frequency n'a pas été déclarée publique, ce aurait besoin d'être exécuté par du code ayant un accès à la classe Token. En outre, vous référencez compareTwoToken, mais dans l'extrait que vous avez publié, vous ne fournissez pas une telle fonction.

+0

Merci votre confiance: j'ai été ajouter methor comparer deux jetons! – tiendv

0

Vous pouvez utiliser ce code

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

Merci pour votre confiance, mais je ne veux pas supprimer jeton dans texchunk – tiendv

0

La fréquence du mot est le nombre de fois qu'il est présent dans la phrase. Vous pouvez utiliser un petit code pour que

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

Le code ci-dessus est juste pour mot particulier que vous avez fait votre chemin. Le code ci-dessous est utile pour trouver la frquency: méthode

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

Ainsi Collections.frequency() vous donnera la fréquence de chaque mot dans une collection.

Questions connexes