2016-11-14 5 views
0

Я начинаю программировать на Android, ища советы/конструктивную критику. Я использую приведенный ниже код для создания трехмерного массива из содержимого файла strings.xml. Как только массив был сгенерирован, у меня есть дополнительный код (не прилагается), который выбирает определенное значение из массива и использует его для выполнения некоторых вычислений и отображения результата в текстовом виде. Является ли мой подход хорошим или есть лучший способ достичь моей цели? Заранее спасибо.Трехмерный массив из strings.xml

Вот небольшой образец содержимого strings.xml (существует около 50 строковых массивов с от 4 до примерно 150 элементов, с каждым элементом, содержащего 10 целых чисел или десятичных значения):

<string-array name="state1"> 
    <item>686, 33, 22, 93, 76, 38, 45, 52, 2, 0.55</item> 
    <item>600, 34, 25, 92, 76, 36, 43, 50, 2, 0.51</item> 
    <item>774, 33, 28, 91, 74, 28, 35, 42, 2, 0.43</item> 
</string-array> 

<string-array name="state2"> 
    <item>20, 52, 23, 57, 53, -19, -13, -6, 1, 90</item> 
    <item>289, 67, -38, 73, 58, -26, -19, -12, 2, 24</item> 
    <item>2156, 68, -35, 66, 53, -36, -29, -22, 2, 77</item> 
    <item>131, 61, -4, 68, 57, -19, -12, -6, 1, 14</item> 
    <item>138, 61, -7, 70, 58, -19, -12, -5, 1, 11</item> 
    <item>194, 61, -9, 71, 58, -23, -16, -9, 1, 13</item> 
    <item>342, 61, -13, 71, 58, -20, -14, -7, 2, 13</item> 
    <item>112, 55, 20, 69, 59, -13, -6, 0, 1, 8</item> 
</string-array> 

Вот мой MainActivity.java:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Resources res = getResources(); 
     int i, j, k; 
     float[][][] weatherData = new float[60][200][10]; 
     for (i = 1; i < 3 ; i++) 
     { 
      int arrayID = res.getIdentifier("state" + i,"array",getPackageName()); 
      String[] stateData = res.getStringArray(arrayID); 
      int m = stateData.length; 
      for (j = 0; j < m ; j++) 
      { 
       String[] dataValues = stateData[j].split(","); 
       int n = dataValues.length; 
       for (k = 0; k < n; k++) 
       { 
        weatherData[i-1][j][k] = Float.parseFloat(dataValues[k]); 
       } 
      } 
     } 
     Log.v("value", ""+weatherData[1][14][9]); 
    } 
} 
+0

если вы используете Java, вы нужно узнать что-то о OO, например, инкапсуляцию ... Это поможет вам сделать ваш код более легким для чтения. – Lucas

+0

Совет по оптимизации: похоже, вы делаете некоторые вычисления на некоторых статических данных. Вместо этого вы можете сохранить результат вычислений, чтобы вам не приходилось повторять его. Вы можете использовать для этого класс java и хранить массивы в качестве констант. –

+0

@KNeerajLal Данные в трехмерном массиве состоят из всех постоянных значений, и активность, которая будет содержать этот код, выберет только одно значение из массива и только один раз. – KJG

ответ

0

Мое предложение было бы не использовать строковые массивы Android здесь. Он выглядит грязным, и он явно не предназначен для использования с 3D-данными. Я предпочел бы использовать простой текстовый файл в вашем случае.

Формат файла может быть что-то подобное x,y,z:value например:

0,0,1:0.5 
0,0,2:2 
1,1,1:12.1 

Исходные данные могут быть помещены в /res/raw/data.txt, и доступ к ним так:

InputStream inputStream = context.getResources().openRawResource(R.raw.data); 
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
String line; 

while ((line = reader.readLine()) != null) { 
    // process single line here 
} 
+0

Я думаю, что немного дополнительной информации может быть полезно. В действии непосредственно перед этим пользователю предоставляется возможность выбрать страну (используя счетчик). Этот выбор обновляет второй счетчик со списком состояний для этой страны. Когда пользователь выбирает состояние, третий счетчик обновляется списком городов в этом состоянии. Я планирую иметь 3-мерный массив для каждой страны. Пользуясь вашим предложением, мне кажется, что мне понадобится 50 исходных текстовых файлов данных, содержащих числовые данные, соответствующие каждому государству/городу (для США). Это верно? – KJG

+0

Спасибо! Я попробовал это, и я думаю, что это лучший вариант. – KJG

Смежные вопросы