Ho scritto il codice riportato di seguito con l'intento di avere le n frequenze più alte o più basse di un qualsiasi file di testo, ma durante la compilazione mi dà l'errore che ho riportato nel titolo della discussione e non so come ovviare al problema, non ci ho mai capito molto tra static, istanze ecc. Vi ringrazio in anticipo
codice:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class FrequenzaFile extends JFrame
{
private JButton jBNumTop=new JButton("10");
private JButton jBscelta=new JButton("Scelta file");
private JFileChooser File_scelta= new JFileChooser();
private JPanel jPdati= new JPanel();
private JPanel jPmenu= new JPanel();
private JButton jBFreqA=new JButton("N frequenze più alte");
private JButton jBFreqB=new JButton("N frequenze più basse");
String nomeFile="";
public FrequenzaFile (int larg,int altezza)
{ setSize(larg,altezza);
Container contenitore=getContentPane();
contenitore.setLayout(new BorderLayout());
jPmenu.setLayout(new GridLayout(2,3));
jPmenu.add(jBscelta);jBscelta.addActionListener(new EvButton());
jPmenu.add(new Label("Numero caratteri più frequenti:"));
jPmenu.add(jBNumTop); jBNumTop.addActionListener(new EvButton2());
jPmenu.add(new Label("Quali frequeze desideri?"));
jPmenu.add(jBFreqA);
jPmenu.add(jBFreqB);
contenitore.add(jPmenu,"North");
contenitore.add(jPdati,"Center");
}
public static void main(String arg[])
{ FrequenzaFile F_uno=new FrequenzaFile(600,600);
F_uno.addWindowListener(new ev_Finestra());
// F_uno.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
F_uno.setLocation(200,0);
F_uno.setVisible(true);
}
public void paintComponent(Graphics g)
{ paintComponents(g); paintAll(g);}
private void visualizza( FrequenzaByte topChar[], int numTotale)
{ String [] titCol={"codice","car","freq.ass.","freq.rel."};
jPdati.removeAll();
jPdati.setLayout(new GridLayout(topChar.length+1, titCol.length));
for(int i=0; i<titCol.length; i++){
jPdati.add(new JButton(titCol[i]));
}
for(int i=0;i<topChar.length;i++){
jPdati.add(new JButton(""+(int)topChar[i].carattere));
jPdati.add(new JButton(""+topChar[i].carattere));
jPdati.add(new JButton(""+topChar[i].frequenza));
jPdati.add(new JButton(""+topChar[i].frequenza*100/numTotale+"%"));
}
setVisible(true);
}
private void aggiorna()
{ int n=(Integer.parseInt(jBNumTop.getText())+1)%16+5;
jBNumTop.setText(""+n);
if(nomeFile.length()==0) selezionaFile();
else statisticheFile(nomeFile);
}
private void selezionaFile()
{ try{if (File_scelta.showOpenDialog(null)==JFileChooser.APPROVE_OPTION)
{nomeFile=File_scelta.getSelectedFile().getPath();
statisticheFile(nomeFile);
}
}
catch(Exception ex) {System.out.println(ex.getMessage());}
}
private void statisticheFile(String nomefile){
Frequenze freq=new Frequenze();
freq.frequenzedaFile(nomeFile);
int numTop=Integer.parseInt(jBNumTop.getText());
int totale=freq.conta();
visualizza(freq.topFrequenze(numTop),totale);
}
private void selezionaFrequenza()
{ String freq=JOptionPane.showInputDialog(null,"Di quanti caratteri si desidera la frequeza?","10");
jBNumTop.setText(freq);
}
class EvButton2 implements ActionListener
{ public void actionPerformed(java.awt.event.ActionEvent evt)
{
selezionaFrequenza();
}
}
class EvButton implements ActionListener
{ public void actionPerformed(java.awt.event.ActionEvent evt)
{ selezionaFile();
}
}
class ev_Finestra extends WindowAdapter
{ private void windowClosing(WindowEvent event)
{JOptionPane p1=new JOptionPane();
int x=p1.showConfirmDialog(null,"Conferma per terminare","ATTENZIONE",2);
if(x==JOptionPane.YES_OPTION)System.exit(0);
}
}
}
Questa è u altra classe contenuta nella stessa cartelle, non so se può essere d'aiuto:
codice:
import java.io.*;
public class FrequenzaByte
{ char carattere;
int frequenza;
public FrequenzaByte(char c, int fr)
{ carattere=c;
frequenza=fr;
}
}
class Frequenze
{ int[] frequenze= new int[256];
public Frequenze()
{ for(int i=0; i<frequenze.length;i++)
frequenze[i]=0;
}
private int indMaxVettore( int [] v)
{ int indMax=0;
for(int i=0;i<v.length;i++)
if(v[indMax]<v[i]) indMax=i;
return indMax;
}
public int conta()
{ int s=0;
for(int i=0;i<frequenze.length;i++)
s+=frequenze[i];
return s;
}
public void frequenzedaFile(String nomeFile)
{ frequenze=new int[256];
for(int i=0;i<frequenze.length;i++) frequenze[i]=0;
RandomAccessFile f;
try{f=new RandomAccessFile(nomeFile, "rw");
int byteLetto;
try{ while((byteLetto=f.readByte())!=-1)
frequenze[byteLetto]++;
}
finally {f.close();}
}
catch(Exception ex) {System.out.println(ex.getMessage());}
}
public FrequenzaByte[] topFrequenze(int numTop)
{ FrequenzaByte[] topByte= new FrequenzaByte[numTop];
int indMax=0;
for(int i=0;i<topByte.length;i++){
topByte[i]=new FrequenzaByte((char)indMax,frequenze[indMax]);
frequenze[indMax]=0;
}
return topByte;
}
}