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