Java编程作业

时间:2011-04-18 20:57:39

标签: java

任务是:编写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.

4 个答案:

答案 0 :(得分:5)

您正试图以静态方法访问某些非静态属性:

如果您有以下课程

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

中的属性

答案 1 :(得分:2)

尝试将频率设为静态开始。这应该工作,或至少改善你的情况。然后努力实现@Robert Harvey更好的解决方案。

其中一个“诀窍”是让你的东西上班然后只进行非常小的改变 - 一次一行 - 并确保它在每次改变之间始终有效。

这样,如果你打破了某些东西,你就会知道它究竟发生了什么。

如果在将“频率”更改为静态后收到其他错误消息,请告诉我该错误消息是什么。

另外,只是评论:

frequencies[ NOUN ] += words[ i ].endsWith( "D" ) ? 1 : 0;

不像以下那样可读:

if( words[ i ].endsWith( "D" ) )
    frequencies[ NOUN ]++;

或(如果你必须在一行上)

if( words[ i ].endsWith( "D" ) ) frequencies[ NOUN ]++;

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

不要感到沮丧 - 或者如果你确实休息一下,稍后回来,那么它会更有意义。 (这是另一个程序员的伎俩 - 整夜处理一个难题时,解决方案通常会在第二天洗澡时来到你身边)

答案 2 :(得分:0)

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

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

现在你写一个这样的主方法:

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”你说,“取决于你在说什么?”。对?现在你明白了。我希望。祝好运。 :)

答案 3 :(得分:0)

 ArrayList<NiceListItem> santaNiceList = new ArrayList<NiceListItem>();
    final int TOTAL_NUMBER_OF_PRESENTS = 4 ;
    int totalPeople=0;

    while (totalPeople<5){
        //it will pick a random name
        Name randomPerson = new Name();
        randomPerson.setName(randomizeFirstName(),randomizeLastName());

        // it will randomize the presents
        ArrayList<String> randomPresents =new ArrayList<String>(); 
        randomPresents.clear();
        for (int index = 0; index < TOTAL_NUMBER_OF_PRESENTS; index++){
            randomPresents.add(randomizePresent());
        }
        //it will adds up together
    santaNiceList.add(new NiceListItem(randomPerson,randomPresents));

      // it will keeps counting
    totalPeople++;
    }
    for (int index = 0; index < santaNiceList.size(); index++) {
        System.out.println(santaNiceList.get(index));
    }
    }
//list of presents for NiceList
public static String randomizePresent(){
String possiblePresents[] = {"Shoes" , "Computer", "Bicycle", "Clothes" ,"Cellphone", "Skateboard"};
int randomId = random(0, possiblePresents.length-1);
return possiblePresents[randomId];
}
//a list of First Name on NiceList
public static String randomizeFirstName(){
String possibleFirstName[] = {"Raymond" , "Anne" , "Rey" , "Eric", "Ralph"};
int randomId = random(0, possibleFirstName.length-1);
return possibleFirstName[randomId];
}
//a list of Last Name on Nicelist from First Name 
public static String randomizeLastName(){
String possibleLastName[] = {"Manalo", "Syversten", "Capillas","Hallil","Reyes"};
int randomId = random(0, possibleLastName.length-1);
return possibleLastName[randomId];
}
//this statement will check the rig
public static int random(int min, int max){
  SecureRandom rnd = new SecureRandom();
  int rand = rnd.nextInt(max * min + 1)+ min;
  rnd = null;
  return rand;