任务是:编写java程序,找出词性之间的词分布百分比。文本在文件duomenys.txt中。单词是这样标记的:名词- D,形容词- B,动词-V和词尾的介词-P。例如,“房子很大”。标记句子:the houseD isV bigB。这就是我所知道的,在第29-32行和第40行有错误。
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Main {
private static FileReader FileReader(File file) {
throw new UnsupportedOperationException("Not yet implemented");
}
int[] frequencies = new int[ 4 ];
private static int NOUN = 0;
private static int ADJ = 1;
private static int VERB = 2;
private static int PREP = 3;
public static void main ( String [] args ) throws IOException {
String filename = "duomenys.txt";
File file = new File( System.getProperty( "user.dir" ), filename);
FileReader fin = FileReader( file );
Scanner sc = new Scanner( fin );
int wordCount = 0;
while( sc.hasNext() ) {
String s = sc.nextLine();
String[] words = s.split(" ");
for( int i = 0; i < words.length; i++) {
frequencies[ NOUN ] += words[ i ].endsWith( "D" ) ? 1 : 0;
frequencies[ ADJ ] += words[ i ].endsWith( "B" ) ? 1 : 0;
frequencies[ NOUN ] += words[ i ].endsWith( "V" ) ? 1 : 0;
frequencies[ PREP ] += words[ i ].endsWith( "P" ) ? 1 : 0;
wordCount++;
}
}
fin.close();
String[] partsOfSpeech = {"nouns", "adjectives", "verbs", "prepositions"};
for( int i = 0; i < partsOfSpeech.length; i++) {
double percentage = frequencies[i] / wordCount;
System.out.println( "There are " + frequencies[ i ] + " " + partsOfSpeech[ i ] + " (" + percentage + ")");
}
}第一个错误出现在这里:frequencies[ NOUN ] += words[ i ].endsWith( "D" ) ? 1 : 0;
错误是:non-static variable frequencies cannot be referenced from a static context.
发布于 2011-04-19 05:08:17
您正在尝试访问静态方法中的一些非静态属性:
如果你有下面的类
public class Test{
public int Property;
public static voidDoSomething(){
//You cannot access Property here, because
//it's not static. It needs to be initialized first.
}
}在本例中,您使用静态方法main,并尝试访问非静态方法frequencies。
为了避免这些问题,作业练习通常会这样做:
public class Main{
public int Property;
public void Start(){
///you can access Property here
}
public static void main ( String [] args ){
new Main().Start();
}
}这样就避免了试图访问static void main中的属性时出现的问题
发布于 2011-04-19 05:57:17
首先,尝试将频率设置为静态频率。这应该会起作用,或者至少可以改善你的情况。然后朝着@Robert Harvey的更好的解决方案努力。
其中一个“诀窍”是让你的东西正常工作,然后只做很小的修改--也许一次只修改一行--并确保每次修改之间都能正常工作。
这样,如果你弄坏了什么东西,你就能确切地知道它弄坏了什么。
如果您在将"frequencies“更改为static后收到不同的错误消息,请让我知道该错误消息是什么。
另外,只有一条评论:
frequencies[ NOUN ] += words[ i ].endsWith( "D" ) ? 1 : 0;的可读性不如:
if( words[ i ].endsWith( "D" ) )
frequencies[ NOUN ]++;或者(如果你必须把它放在一行)
if( words[ i ].endsWith( "D" ) ) frequencies[ NOUN ]++;如果你专注于让你的代码简单易读,而不是尽可能的简短,你会发现事情变得容易得多。
不要灰心丧气--或者如果你真的休息了一下,然后再回来,那就更有意义了。(这是程序员的另一个诀窍--当你通宵解决一个难题时,第二天洗澡的时候,解决方案通常就会出现在你面前。)
发布于 2011-10-08 16:18:26
我会尽力解释的。“静态”变量和方法属于类。它们由该类的所有对象(或“实例”)共享。"Instance“变量和方法属于特定的对象。系统中的每个对象都有不同的副本。举个例子:
class MySimpleObject {
private int myCount = 0;
private static int everybodyCount = 0;
public void add() {
myCount++;
everybodyCount++;
}
public void print() {
System.out.println("myCount = " + myCount + ", everybodyCount = " + everybodyCount);
}
}现在编写一个main方法,如下所示:
public static void main(String[] args) {
MySimpleObject first = new MySimpleObject();
MySimpleObject second = new MySimpleObject();
first.add();
second.add();
second.add();
}如果您现在调用first.print(),您将看到myCount =1和everybodyCount = 3。如果您调用second.print(),您将看到myCount =2和everybodyCount = 3。看到实例数据(myCount,非静态)是如何保持分离的,而静态数据(everybodyCount)是如何共享的?这就是我们的想法。
所以,关键是,如果你在一个“静态”方法中,你是在类级别上操作的。您仍然可以访问静态数据,因为这是每个人都共享的数据。您无法访问实例数据,因为没有实例。也就是说,如果我现在让你告诉我"everybodyCount“,那就简单了。你说3.如果我让你告诉我"myCount“,你会说:”取决于,你说的是哪个实例?“对吗?现在你明白了。我希望如此。祝好运。:)
https://stackoverflow.com/questions/5708812
复制相似问题