Как да определите ASCII стойността на дума

Създавам програма, която импортира голям списък от думи. Този списък е разделен по думи, но сега трябва да определя ASCII стойността на всяка дума в този списък и евентуално коя има най-високата обща ASCII стойност. Получавам няколко грешки и трябва да знам как да коригирам това, за да мога да получа всяка стойност.

public static void main(String[] args) throws IOException {


    //import list of words 
    BufferedReader File = new BufferedReader(new FileReader(LOC)); 

    //Create a temporary ArrayList to store data
    ArrayList<String> words = new ArrayList<String>();

    //Find number of lines in txt file
    String line;
    String delimiter = "\t";
    while ((line = File.readLine()) != null)
        //read the file
    {
        String[] wordsInLine = line.split(delimiter);

        //separate the words
        for(int i=0, isize = wordsInLine.length; i < isize; i++){
            words.add(wordsInLine[i]);//put them in a list

    //assess each character in the word to determine the ascii value
    int total = 0;
    for (int i=0; i < wordsInLine.length(); i++)

Получаване на грешка на горния ред, който гласи - Не може да се извика length() на масив от тип String[] - Дублиране на локална променлива i

       {
       char c = word.charAt(i);

Получаване на грешка на горния ред, който гласи, че думата не може да бъде разрешена

       int j = (int) c;
       total += c;
       }

Направих някои изследвания, опитвайки се да определя най-добрия начин за изчисляване на ASCII стойността на всяка дума и не успях да намеря много информация как да направя това. Ако някой може да погледне моя код, ще съм благодарен!! Освен това, преди някой да го каже, нека просто кажа, че това НЕ е училищен проект. В лятна ваканция съм и започвам програмиране II през есента и просто се опитвам да продължа да кодирам, за да не съм ръждясал през есента. БЛАГОДАРЯ ТИ!!! :))


person mrsw    schedule 18.07.2014    source източник
comment
защо използвахте \t като ваш разделител?   -  person Kick Buttowski    schedule 18.07.2014
comment
можете ли да публикувате целия код, за да мога да го стартирам отделно?   -  person Kick Buttowski    schedule 18.07.2014
comment
@KickButtowski \t отделя всяка дума във файла ми вместо мен.   -  person mrsw    schedule 18.07.2014
comment
има ли място за табулатори между вашите записи?   -  person Kick Buttowski    schedule 18.07.2014
comment
@KickButtowski целият код е публикуван. Искате ли да направя повторно публикуване без прекъсване на описанието?   -  person mrsw    schedule 18.07.2014
comment
@KickButtowski Да, има табулация, без запетаи или нещо подобно, затова избрах \t.   -  person mrsw    schedule 18.07.2014
comment
трябва да видите отговорите на други, мисля, че вече са ви помогнали. ако все още имате проблем, уведомете ни   -  person Kick Buttowski    schedule 18.07.2014
comment
Какво е значението на ASCII стойността на дадена дума? за какво бихте използвали изчислената стойност?   -  person philippe lhardy    schedule 18.07.2014
comment
@philippelhardy Искам да получа общата ASCII стойност на всяка дума, за да мога след това да определя коя дума в моя списък има най-голяма стойност. Просто правя стъпка по стъпка :)   -  person mrsw    schedule 18.07.2014
comment
искаш да кажеш, че основно искаш да сравняваш лексикографски низове? като ZZ е по-голям от Zy?   -  person philippe lhardy    schedule 18.07.2014
comment
@asrivat готово! Приех отговора на Раджеш :)   -  person mrsw    schedule 18.07.2014
comment
Готино! Радвам се, че сте намерили решение, което работи!   -  person Akshay    schedule 18.07.2014
comment
може да ви е интересно да научите за String.hashCode()   -  person philippe lhardy    schedule 18.07.2014
comment
@NewbieGirl Бих ви насочил към моя отговор. Не вярвам, че имате пълното решение.   -  person progrenhard    schedule 18.07.2014


Отговори (4)


Получаване на грешка на горния ред, който гласи - Не може да се извика length() на масив от тип String[] - Дублиране на локална променлива i

wordsInLine е масив, а length е свойство на масива. Така че трябва да използвате:

wordsInLine.length

Ако wordsInLine беше String, тогава wordsInLine.length() щеше да има смисъл.

Получаване на грешка на горния ред, която гласи, че думата не може да бъде разрешена

Преди ред char c = word.charAt(i); добавете по-долу:

 String word = wordsInLine[i];
person Rajesh    schedule 18.07.2014
comment
Все още получавам грешка, че дублира локална променлива i. Защо получавам тази грешка?? - person mrsw; 18.07.2014
comment
премахнете скобата в края на ред for(int i=0, isize = wordsInLine.length; i < isize; i++){ - person Rajesh; 18.07.2014
comment
винаги са малките неща, нали. Благодаря ти!! Сега имам проблем с моя println. Имам System.out.println (думи = общо); Състояния на грешка: Множество маркери на този ред - общата сума не може да бъде разрешена или не е поле - person mrsw; 18.07.2014
comment
променете го на: System.out.println (words + "=" + total);. В java + е операторът за конкатенация. - person Rajesh; 18.07.2014
comment
работя върху това отново и забелязвам, когато изпълнявам програмата, че изходът е непрекъснат, така че нещо не е наред с моя цикъл. - person mrsw; 20.07.2014

За проблема wordsInLine.length() length() не е валиден метод за масиви. Всъщност трябва да получите достъп до полето за дължина по следния начин: wordsInLine.length без ().

Що се отнася до word.charAt(i), вие не сте декларирали никъде променлива, наречена word, което е причината за проблема. Това, което наистина искате да направите, е да сумирате стойностите за всяка дума в масива и за това ви е необходим вложен цикъл.

Казахте също, че искате да разберете кой има най-висока стойност. За да направите това, просто следете най-големия и го актуализирайте след всяка итерация по следния начин:

int indexOfMax = 0;
int[] sums = new int[wordsInLine.length];

//Iterate over every word
for(int i = 0; i < wordsInLine.length; i++)
{
    //Reset the total for each word
    total = 0;

    //Iterate over every character in the word
    for(int j = 0; j < wordsInLine[i].length(); j++)
    {
        char c = wordsInLine[i].charAt(j);
        total += c;
    }

    //Remember the sum for this word
    sums[i] = total;

    //If the word's sum is greater than our previous max,
    //make it the new max
    if(sums[i] > sums[indexOfMax])
    {
        indexOfMax = i;
    }
}

И сега можете да получите думата с най-голяма ASCII стойност, като извикате wordsInLine[indexOfMax]. Той ще има ASCII сума от sums[indexOfMax].

person Akshay    schedule 18.07.2014
comment
Лошо предположение. Мисля, че има нужда от двоен цикъл. - person ajb; 18.07.2014

  1. wordsInLine е масив и следователно няма метод за получаване на дължината му. Вместо това, за да получите дължината на масив, използвайте array.length вместо това, което правите: array.length() (което причинява грешка).

  2. word не е дефинирана променлива, затова java казва, че не може да бъде разрешена (не може да намери никаква декларация). Вместо това искате да използвате 2 for цикъла, за да преминете през всеки знак в думата в масива wordsInLine. Имате и два екземпляра на променливата i, това не е позволено. За да коригирате тези грешки, напишете следния код след `int total = 0;':

    int total = 0; // Don't rewrite this line
    int[] totals = new int[wordsInLine.length]; // If you want to add all your totals to an array
    for (int j=0; j < wordsInLine.length; j++) {
        total = 0;
        for (int k=0; k < wordsInLine[j].length(); k++) { // Here wordsInLine[j] is a string so you use .length() instead of .length
            char c = wordsInLine[j].charAt(k);
            int w = (int) c; // Get ascii of c
            total += w; // Add it to total
        }
        // Do something with the total of this word before it gets reset to 0
        // Maybe add it to an array of totals:
        totals[j] = total;
    }
    

    Надявам се това да помогне!

person Zach    schedule 18.07.2014

Е, вашата организация на вашия код се нуждае от малко работа.

Първо бих извел целия този блок код извън файла, прочетен в while цикъл.

for (int i=0; i < wordsInLine.length(); i++)
{
   char c = word.charAt(i);
   int j = (int) c;
   total += c;
 }

Защо? Нека разделим това, което правите, на две стъпки. Прочетете всички words в списъка word. След като направите това, ще откриете къде е основният ви корен на проблема. Изобщо не четете думите от вашия word списък.

Допълнително почистване на кода

for(int i=0, isize = wordsInLine.length; i < isize; i++){

Тази линия е малко раздута. Изобщо не се нуждаете от isize, по същество го обозначавате без причина. (Ами всъщност кеширането на дължината подобрява ефективността, още един разговор за друг ден). Почистване.

for(int i=0, ; i < wordsInLine.length; i++){

След това коригиране на целия проект

//import list of words 
BufferedReader File = new BufferedReader(new FileReader(LOC)); 

//Create a temporary ArrayList to store data
ArrayList<String> words = new ArrayList<String>();

//Find number of lines in txt file
String line;
String delimiter = "\t";
// adds all the words into the list.
while ((line = File.readLine()) != null)
{
    String[] wordsInLine = line.split(delimiter);
    for(int i=0, ; i < wordsInLine.length; i++){
       // compute alg and store the value some how to the word.
        words.add(wordsInLine[i])
    }
}

// notice outside the while loop.
// .size() is used for lists and .length is used for arrays.
for(int i = 0; i < words.size(); i++){
   // compare
}
person progrenhard    schedule 18.07.2014
comment
Това не решава нито един от проблемите, повдигнати от плаката. Вашият код е също толкова развален, колкото и оригинала. - person Akshay; 18.07.2014
comment
@asrivat1 Не довърших отговора. Но много хора пропускат основния проблем. Това не е използване на words като директория за изпълнение на алгоритъма за сравнение. - person progrenhard; 18.07.2014
comment
@asrivat1 Е, има значение. total се нулира на 0 всеки път, когато цикълът while преминава през друг ред. По този начин преминава само през малка част от файла... Има значение. - person progrenhard; 18.07.2014