#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, это проблема или что вы имеете в виду?