Как определить 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 — это массив, а длина — это свойство массива. Итак, вы должны использовать:

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. слово не является определенной переменной, поэтому 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 asrivat1 Я не закончил ответ. Но многие люди упускают из виду основную проблему. Это не использует words в качестве каталога для запуска алгоритма сравнения. - person progrenhard; 18.07.2014
comment
@ asrivat1 Ну, это имеет значение. total сбрасывается на 0 каждый раз, когда цикл while проходит через другую строку. Таким образом, просматривается только небольшое подмножество файла... Это имеет значение. - person progrenhard; 18.07.2014