2016-08-17 2 views
2

Я получил значения из таблицы с сайта для приложения для опроса президента в андроиде, который я создаю. Я храню четыре столбца в четырех разных arraylists. Когда я пытаюсь получить значения, используя arraylist.get(), и сохраним их в массиве, arraylist.get() возвращает null. Я отобразил ArrayList на ListView, и все значения появились, поэтому я знаю, что значения были сохранены правильно. , если вы посмотрите на веб-сайт, который я использую, он имеет все данные опроса, начиная с начала опроса. Массив будет содержать 8 последовательных опросов, которые я усредню, а затем график на графике. Я возьму дату начала первого из восьми опросов и дату окончания последнего из восьми опросов, и найду дату точно между ними, и использую эту дату в качестве координаты x для моей точки опроса. Тогда я сделаю то же самое для следующих восьми опросов. Вот почему я сначала проверяю, делится ли общее количество опросов на веб-сайте на восемь или нет. Если количество опросов на веб-сайте не делится на 8, я перехожу к другому и вычитаю оставшуюся часть. После того, как цикл будет завершен, я по отдельности усредню оставшиеся. Вот мой код:Arraylist.get return null

package com.pollapp.presidentialelectionpolls; 

import java.io.IOException; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.content.Context; 
import android.view.Menu; 
import android.widget.Toast; 

@SuppressLint("NewApi") 
public class MainActivity extends Activity { 

    Document doc; 
    Element table; 
    Elements rows; 
    Element row; 
    Elements cols; 
    Elements link; 
    int remainderNum = 0, i = 0; 
    String startingDate, endingDate; 
    Date start, end; 
    DateFormat df = new SimpleDateFormat("MM/dd"); 
    String[][] average = new String[8][3]; 
    ArrayList<String> nameOfSrc = new ArrayList<String>(); 
    ArrayList<String> dateWidth = new ArrayList<String>(); 
    ArrayList<String> Trump = new ArrayList<String>(); 
    ArrayList<String> Clinton = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
       .permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 

     try { 
      ConnectivityManager cm = (ConnectivityManager) this 
        .getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo ni = cm.getActiveNetworkInfo(); 
      Boolean isConnect = ni == null ? false : ni 
        .isConnectedOrConnecting(); 
      if (isConnect) { 
       doc = Jsoup 
         .connect(
           "http://www.realclearpolitics.com/epolls/2016/president/us/general_election_trump_vs_clinton-5491.html") 
         .get(); 
       table = doc.select("table.data.large").get(1); 
       rows = table.select("tr"); 
      } 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 


     for (int i = 2; i < rows.size(); i++) { 
      row = rows.get(i); 
      cols = row.select("td"); 
      link = cols.get(0).select("a"); 
      nameOfSrc.add(link.get(0).text()); 
      dateWidth.add(cols.get(1).text()); 
      Clinton.add(cols.get(4).text()); 
      Trump.add(cols.get(5).text()); 
     } 

     if ((dateWidth.size() % 8) == 0) { 
      for (i = (dateWidth.size()-1); i <= 7; i = i-8) { 
       average[i][0] = dateWidth.get(i); 
       average[i][1] = Clinton.get(i); 
       average[i][2] = Trump.get(i); 

       average[i-1][0] = dateWidth.get(i-1); 
       average[i-1][1] = Clinton.get(i-1); 
       average[i-1][2] = Trump.get(i-1); 

       average[i-2][0] = dateWidth.get(i-2); 
       average[i-2][1] = Clinton.get(i-2); 
       average[i-2][2] = Trump.get(i-2); 

       average[i-3][0] = dateWidth.get(i-3); 
       average[i-3][1] = Clinton.get(i-3); 
       average[i-3][2] = Trump.get(i-3); 

       average[i-4][0] = dateWidth.get(i-4); 
       average[i-4][1] = Clinton.get(i-4); 
       average[i-4][2] = Trump.get(i-4); 

       average[i-5][0] = dateWidth.get(i-5); 
       average[i-5][1] = Clinton.get(i-5); 
       average[i-5][2] = Trump.get(i-5); 

       average[i-6][0] = dateWidth.get(i-6); 
       average[i-6][1] = Clinton.get(i-6); 
       average[i-6][2] = Trump.get(i-6); 

       average[i-7][0] = dateWidth.get(i-7); 
       average[i-7][1] = Clinton.get(i-7); 
       average[i-7][2] = Trump.get(i-7); 

       startingDate = average[i][0].substring(0, average[i][0].indexOf(" ")); 
       endingDate = average[i-7][0].substring(average[i-7][0].lastIndexOf(" ") + 1); 

      } 
     } else { 
      remainderNum = (dateWidth.size() % 8); 

      for (i = (dateWidth.size() - 1); i <= (remainderNum + 7); i = i-8) { 
       average[i][0] = dateWidth.get(i); 
       average[i][1] = Clinton.get(i); 
       average[i][2] = Trump.get(i); 

       average[i-1][0] = dateWidth.get(i-1); 
       average[i-1][1] = Clinton.get(i-1); 
       average[i-1][2] = Trump.get(i-1); 

       average[i-2][0] = dateWidth.get(i-2); 
       average[i-2][1] = Clinton.get(i-2); 
       average[i-2][2] = Trump.get(i-2); 

       average[i-3][0] = dateWidth.get(i-3); 
       average[i-3][1] = Clinton.get(i-3); 
       average[i-3][2] = Trump.get(i-3); 

       average[i-4][0] = dateWidth.get(i-4); 
       average[i-4][1] = Clinton.get(i-4); 
       average[i-4][2] = Trump.get(i-4); 

       average[i-5][0] = dateWidth.get(i-5); 
       average[i-5][1] = Clinton.get(i-5); 
       average[i-5][2] = Trump.get(i-5); 

       average[i-6][0] = dateWidth.get(i-6); 
       average[i-6][1] = Clinton.get(i-6); 
       average[i-6][2] = Trump.get(i-6); 

       average[i-7][0] = dateWidth.get(i-7); 
       average[i-7][1] = Clinton.get(i-7); 
       average[i-7][2] = Trump.get(i-7); 

       startingDate = average[i][0].substring(0, average[i][0].indexOf(" ")); 
       endingDate = average[i-7][0].substring(average[i-7][0].lastIndexOf(" ") + 1); 

      } 
     } 
     Toast.makeText(getApplicationContext(), startingDate + ", " + endingDate, Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 
+0

только сторона примечание, '0% 8' также' 0'. – SomeJavaGuy

+1

В чем смысл первого использования динамических массивов, чтобы затем перевести материал в негибкие массивы? Btw: проверить java styleguides на именование. Имена переменных всегда начинаются с lowerCase; даже когда они обозначают людей такими огромными эго, как г-н «Темный принц» Трамп или Хиллари «Гнилая» Клинтон. – GhostCat

+0

@GhostCat, если вы посмотрите на веб-сайт, который я использую, он имеет все данные опроса, начиная с начала опроса. Массив будет содержать 8 последовательных опросов, которые я усредню, а затем график на графике. Я возьму дату начала первого из восьми опросов и дату окончания последнего из восьми опросов, и найду дату точно между ними, и использую эту дату в качестве координаты x для моей точки опроса. Тогда я сделаю то же самое для следующих восьми опросов. Вот почему я сначала проверяю, делится ли общее количество опросов на веб-сайте на восемь или нет. –

ответ

3

Я хочу дать другой вид ответа. Ваша проблема real заключается в том, что в вашем коде отсутствуют разумные абстракции.

Значение: ваша программа связана с «данными» вокруг «кандидата». Но у вас есть вся эта информация во многих разных списках. Это просто неправильно.

Вместо этого вы можете создать такой класс, как Кандидат; и у кандидата есть имя и, вероятно, данные, связанные с ним.

Другими словами: вы должны стараться избегать «программируемого» стиля программирования «низкого уровня», где индекс 1 означает «точка данных для Клинтона» и 2 означает «точка данных для Trump».

Вместо этого вы должны иметь экземпляры этого класса кандидата; и нажмите на них точки данных. Это позволит вам в полной мере избавиться от вашего кода; тем самым облегчая вам работу над проблемой real, которую вы заинтересованы в решении.

Короче говоря: ваш код не использует разумные абстракции; таким образом, это так «абстрактно», чтобы читать, понимать и находить в нем ошибки.