Как подать заявку на цикл для первых n значений arraylist

#java #arrays #for-loop #arraylist

#java #массивы #for-цикл #arraylist

Вопрос:

У меня есть arraylist, в котором у меня есть ESSID, BSSID, сила точки доступа по первым трем индексам, а с индекса 4 по 6 у меня снова есть ESSID, BSSID, сила другой точки доступа. Я хочу сохранить этот список в базе данных, как первые три значения, сохраненные в одной строке таблицы. и следующие три значения сохраняются во 2-й строке таблицы.

 
String[] namesArr = new String[arrayList2.size()];    //conver arraylist to array
for (int j = 0; j < arrayList2.size(); j  ){
    namesArr[j] = arrayList2.get(j);
    int length = namesArr[j].length();
    for (int k = 0; k < length; k  = 3) {
        ssid = namesArr[k];
        bssid = namesArr[k   1];
        rssid = namesArr[k   2];
    }
   insertValues(this);
}
 public void insertValues(View.OnClickListener view){
       SendData send = new SendData(this);
       send.execute(bssid,ssid,rssid);}
  

Я создал класс для хранения этих данных в базе данных, который работает нормально.

 public class SendData  extends AsyncTask<String, Void, String> {
    AlertDialog dialog;
    Context context;

    public SendData(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        dialog = new AlertDialog.Builder(context).create();
        dialog.setTitle("Message");
    }

    @Override
    protected void onPostExecute(String s) {
        dialog.setMessage(s);
        dialog.show();
    }

    @Override
    protected String doInBackground(String... voids) {
        String data = "";
        String result = "";
        String MAC = voids[0];
        String Name = voids[1];
        String Strength = voids[2];


        String con_Str = "http://10.5.48.129/Webapi/accesspoints_data/create.php";
        try{
            URL url = new URL(con_Str);
            HttpURLConnection http = (HttpURLConnection) url.openConnection();
            http.setRequestMethod("POST");
            http.setDoInput(true);
            http.setDoOutput(true);
            OutputStream out_Stream = http.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out_Stream, "UTF-8"));
            JSONObject obj = new JSONObject();
            try {
                obj.put("BSSID", MAC);
                obj.put("ESSID", Name);
                obj.put("RSSID", Strength);


            } catch (JSONException e) {

                e.printStackTrace();
            }

            data = obj.toString();

            writer.write(data);
            writer.flush();
            writer.close();
            out_Stream.close();

            InputStream in_Stream = http.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in_Stream, "ISO-8859-1"));
            String line = "";
            while ((line = reader.readLine()) != null)
            {
                result  = line;
            }

            reader.close();
            in_Stream.close();
            http.disconnect();
            return resu<
        } catch (MalformedURLException e){
            result = e.getMessage();
        } catch (IOException e){
            result = e.getMessage();
        }

        return resu<
    }
}
  

Класс sendData отлично работает, но проблема связана с циклом for.

Комментарии:

1. Формулировка немного неясна, по крайней мере, для меня. Можете ли вы предоставить образец ArrayList и результат, который вы пытаетесь получить для него?

2. где вы сохраняете вторую «запись» ? и третье? и так далее… похоже, существует только одна единственная переменная, возможно, вам следует создать класс Record для хранения каждой «записи»

3. Вопрос неясен, но кажется, что вы всегда используете ssid = namesArr[0], так как на каждой итерации вы устанавливаете k равным нулю

Ответ №1:

Я думаю, что это результат, который вы ожидаете :

 List<String> arrayList2 = new ArrayList<>();
        arrayList2.add("1");
        arrayList2.add("2");
        arrayList2.add("3");
        arrayList2.add("4");
        arrayList2.add("5");
        arrayList2.add("6");
        arrayList2.add("6");
        arrayList2.add("7");
        arrayList2.add("8");
        arrayList2.add("9");
        arrayList2.add("10");
        List<String[]> sarrayList  = new ArrayList<>();
        String[] arr = new String[3];
        int i = 0;
        for (int j = 0; j < arrayList2.size(); j  ) 
        {
            arr[i] = arrayList2.get(j);
            i  ;
            if((j 1)%3==0)
            {
                sarrayList.add(arr);
                i = 0;
                arr = new String[3];
            }

        }

        for(String [] sa:sarrayList)
        {
            for(String s:sa)
            {
                System.out.println(s);
            }
            System.out.println("=========");
        }
  

Возможно, это не самый эффективный способ сделать это. Но он разбивает ArrayList на строковые массивы длиной = 3 и сохраняет их в новом ArrayList с именем sarrayList

Ответ №2:

Я бы посоветовал использовать структуру данных для хранения записи. Смотрите Код ниже, это небольшой пример того, как вы могли бы это сделать

 ArrayList<Record> records;
for (int i = 2; i < inputArrayList.size(); i = i   3){
    string ssid = namesArr.get(i - 2);
    string bssid = namesArr.get(i - 1);
    string rssid = namesArr.get(i);
    records.add(new Record(ssid, bssid, rssid));
}

class Record{
    string ssid;
    string bssid;
    string rssid;
    // Constructor...
    // Getter and setter to be implemented...
}
  

Комментарии:

1. Спасибо. Я создал класс для отправки этих данных на сервер. я думаю, что класс отлично выполняет свою работу. Я просто хочу получить первые 12 значений списка и хочу сохранить первые три значения как одну строку, следующие 3 значения как вторую строку. Я не могу создать цикл для размера массива.

Ответ №3:

хорошо, насколько я понимаю, вы хотите разделить arraylist на 3 элемента, вот как вы это делаете с потоками, и он вернет коллекцию arraylists, каждый из которых имеет 3 элемента

 final int chunkSize = 3;
        final AtomicInteger counter = new AtomicInteger();
        //arrayList here us your array list
        final Collection<List<String>> result = arrayList.stream()
            .collect(Collectors.groupingBy(it -> counter.getAndIncrement() / chunkSize))
            .values();
  

и, упомянув ответ supermar10, вы создаете класс для сопоставления строк с ним таким образом

 class Record{
    string ssid;
    string bssid;
    string rssid;

    Record(String ssid,String bssid,String rssid){
    this.ssid=ssid;
    this.bssid=bssid;
    this.rssid=rssid;

    }
}
  

теперь у вас есть класс для сопоставления, теперь сохраните записи в списке записей
, создайте список в основном классе

 static List<Record> lists=new ArrayList<>();
  

затем сопоставьте данные следующим образом

 result.stream().forEach(nowList -> saveRecord(nowList)); 
  

и это метод сохранения

 static void saveRecord(List<String> list){
         lists.add(new Record(list.get(0),list.get(1),list.get(2)));
    }
  

Ответ №4:

Я упростил его до одного цикла, а также изменил insertValues так, чтобы он принимал еще 3 параметра. Это

 int size = arrayList2.size();
for (int j = 0; j < size; j  = 3) {    
    if (size - j < 3 ) {
        break;
    }    
    String ssid = arrayList2.get(j);
    String bssid = arrayList2.get(j   1);
    String rssid = arrayList2.get(j   2);
    insertValues(this, ssid, bssid, rssid);
}
  

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

 ssid = arrayList2.get(j);
bssid = arrayList2.get(j   1);
rssid = arrayList2.get(j   2);
insertValues();
  

Комментарии:

1. Он выдает только первые три значения. Я хочу получить первые 12 значений.

2. @asma Я написал max вместо size в цикле for, это проблема или что вы имеете в виду?