【问题标题】:How to apply for loop on first n vlalues of arraylist如何在arraylist的前n个值上申请循环
【发布时间】:2019-09-04 00:36:06
【问题描述】:

我有一个数组列表,其中我有前三个索引上的 ESSID、BSSID、接入点强度,从索引 4 到 6,我又有 ESSID、BSSID、另一个接入点的强度。我想将此列表存储在数据库中,就像前三个值保存在一行表中一样。接下来的三个值保存在表格的第二行。


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 result;
        } catch (MalformedURLException e){
            result = e.getMessage();
        } catch (IOException e){
            result = e.getMessage();
        }

        return result;
    }
}

SendData 类运行良好,但问题在于 for 循环。

【问题讨论】:

  • 措辞有点不清楚,至少对我来说是这样。你能提供一个示例 ArrayList 以及你想要得到的结果吗?
  • 第二个“记录”保存在哪里?第三个?等等...看起来只有一个变量,也许您应该创建一个类Record 来保存每个“记录”
  • 问题不清楚,但您似乎总是使用 ssid = namesArr[0],因为在每次迭代中您将 k 设置为零

标签: java arrays for-loop arraylist


【解决方案1】:

我已将其简化为一个循环,并修改了 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();

【讨论】:

  • 它只给出前三个值。我想获得前 12 个值。
  • @asma 我在 for 循环中写的是 max 而不是 size,这是问题还是你的意思?
【解决方案2】:

好吧,据我了解,您想将 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)));
    }

【讨论】:

    【解决方案3】:

    我建议使用数据结构来保存记录。请参阅下面的代码,这是一个小示例,您可以如何做到这一点

    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...
    }
    

    【讨论】:

    • 谢谢。我已经上课将此数据发送到服务器。我认为班级正在完美地完成工作。我只想获取列表的前 12 个值,并希望将前三个值保存为一行,接下来的 3 个值保存为第二行。我无法对数组的大小进行循环。
    【解决方案4】:

    我认为这是您所期望的结果:

    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 的 String 数组,并将它们存储在名为 sarrayList 的新 ArrayList

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多