首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java编程作业

Java编程作业
EN

Stack Overflow用户
提问于 2011-04-19 04:57:39
回答 4查看 766关注 0票数 0

任务是:编写java程序,找出词性之间的词分布百分比。文本在文件duomenys.txt中。单词是这样标记的:名词- D,形容词- B,动词-V和词尾的介词-P。例如,“房子很大”。标记句子:the houseD isV bigB。这就是我所知道的,在第29-32行和第40行有错误。

代码语言:javascript
复制
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.

EN

回答 4

Stack Overflow用户

发布于 2011-04-19 05:08:17

您正在尝试访问静态方法中的一些非静态属性:

如果你有下面的类

代码语言:javascript
复制
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

为了避免这些问题,作业练习通常会这样做:

代码语言:javascript
复制
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中的属性时出现的问题

票数 5
EN

Stack Overflow用户

发布于 2011-04-19 05:57:17

首先,尝试将频率设置为静态频率。这应该会起作用,或者至少可以改善你的情况。然后朝着@Robert Harvey的更好的解决方案努力。

其中一个“诀窍”是让你的东西正常工作,然后只做很小的修改--也许一次只修改一行--并确保每次修改之间都能正常工作。

这样,如果你弄坏了什么东西,你就能确切地知道它弄坏了什么。

如果您在将"frequencies“更改为static后收到不同的错误消息,请让我知道该错误消息是什么。

另外,只有一条评论:

代码语言:javascript
复制
frequencies[ NOUN ] += words[ i ].endsWith( "D" ) ? 1 : 0;

的可读性不如:

代码语言:javascript
复制
if( words[ i ].endsWith( "D" ) )
    frequencies[ NOUN ]++;

或者(如果你必须把它放在一行)

代码语言:javascript
复制
if( words[ i ].endsWith( "D" ) ) frequencies[ NOUN ]++;

如果你专注于让你的代码简单易读,而不是尽可能的简短,你会发现事情变得容易得多。

不要灰心丧气--或者如果你真的休息了一下,然后再回来,那就更有意义了。(这是程序员的另一个诀窍--当你通宵解决一个难题时,第二天洗澡的时候,解决方案通常就会出现在你面前。)

票数 2
EN

Stack Overflow用户

发布于 2011-10-08 16:18:26

我会尽力解释的。“静态”变量和方法属于类。它们由该类的所有对象(或“实例”)共享。"Instance“变量和方法属于特定的对象。系统中的每个对象都有不同的副本。举个例子:

代码语言:javascript
复制
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方法,如下所示:

代码语言:javascript
复制
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“,你会说:”取决于,你说的是哪个实例?“对吗?现在你明白了。我希望如此。祝好运。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5708812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档