本文介绍了android循环错误 - 无法将值放入hashmap的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题困扰了我很长一段时间。我使用名为bmob的云数据库,我发现我可以成功获取我想要的数据。但是,循环中可能存在一些错误,我只能获得最后一个选项的信息。

This problem has bothered me for a long time. I use a cloud database called bmob, and I found that I can successfully get the data I want. However, there might be some mistakes in the loops, and I could only get the information of the last selected item.

p.s。我使用一个名为Playlist的数组列表来存储我将用于在下一个活动中显示列表视图的计算数据。

p.s. I use an array list called Playlist to store the calculated data that I will use to display a list-view in the next activity.

这是我的代码:

public class DestinationActivity extends Activity implements OnClickListener, NumberPicker.OnValueChangeListener {

private TextView from_place, date, days, start_time, end_time, number, money_view;
private Button addButton, subButton;
private ImageView backButton, telephone;
private ListView listView;
private Button destinationOk_btn;
private ShapeLoadingDialog shapeLoadingDialog;

private Tip startTip;

private Calendar calendar;
private DatePickerDialog dialog;
private TimePickerDialog dialog2;

private List<Destination> destinationList = new ArrayList<Destination>();


private DestinationAdapter adapter;

private int number_value = 1;

private String time_start;
private String time_end;
private int travel_days;
double travelTime;//total playing time
double travel_time;
private int money;
private int num = 1;


private ArrayList<Integer> select_placeID = new ArrayList<Integer>();
public Map<Integer,Double> weightMap;
public List<Plan> planList = new ArrayList<Plan>();
int[] selectedID = new int[10];


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

    //initialize the cloud database
    Bmob.initialize(this, BmobConfig.APP_ID);

    listView = (ListView) findViewById(R.id.list_destination);

    destinationOk_btn = (Button) findViewById(R.id.okButton);


    initDestinations(); // initialize the data


    adapter = new DestinationAdapter(destinationList, DestinationActivity.this);
    //adapter = new DestinationAdapter(this, destinationList, DestinationAdapter.getIsSelected());
    listView.setAdapter(adapter);

    //....listeners and textviews.......

    //submit button
    destinationOk_btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            select_placeID.clear();

            for (int i = 0; i < destinationList.size(); i++) {
                if (DestinationAdapter.getIsSelected().get(i)) {
                    select_placeID.add((i + 1));
                }

            }

            //change to int array
            selectedID = new int[select_placeID.size()];
            for(int i = 0;i<select_placeID.size();i++){
                selectedID[i] = select_placeID.get(i);
            }

            if (select_placeID.size() == 0) {
                AlertDialog.Builder builder1 = new AlertDialog.Builder(DestinationActivity.this);
                builder1.setMessage("no records");
                builder1.show();
            }
            else {
                AlertDialog.Builder builder = new AlertDialog.Builder(DestinationActivity.this);

                builder.setMessage("waiting for magic...");
                builder.show();

                /**
                 * calculate the route
                 */
                if (validate()) {
                    new calRoute().execute();
                }


            }
        }

    });
}



//initialize the data
private void initDestinations() {
    //........
}


@Override
public void onClick(View v) {
    //.......
}


/**
 * asynctask
 */
private class calRoute extends AsyncTask<Void, Void, List<Plan>>{


    public calRoute(){
        // TODO Auto-generated constructor stub
    }


    @Override
    protected List<Plan> doInBackground(Void... params) {

        List<Plan> result = calculate(time_start, time_end, travel_days);

        return result;
    }


    @Override
    protected void onPostExecute(List<Plan> result) {
        super.onPostExecute(result);
        if (result != null) {
            Toast.makeText(DestinationActivity.this, "success", Toast.LENGTH_SHORT).show();

            if(planList.size() > 0) {


                Intent intent = new Intent();
                intent.setClass(DestinationActivity.this, ActivityPlan.class);

                intent.putParcelableArrayListExtra("planInfo", (ArrayList<? extends Parcelable>) planList);

                startActivity(intent);
            }

            else{
                Toast.makeText(DestinationActivity.this, "no plan", Toast.LENGTH_SHORT).show();
            }
        }

    }
}


/**
 *plan
 **/
public List<Plan> calculate(String time_start, String time_end, int travel_days) {


    SimpleDateFormat df = new SimpleDateFormat(("HH:mm"));

    Date starttime = new Date();
    Date endtime = new Date();
    try {
        starttime = df.parse(time_start);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    try {
        endtime = df.parse(time_end);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    double l = endtime.getTime() - starttime.getTime();
    double hour = (l / (60 * 60 * 1000));
    double min = ((l / (60 * 1000)) - hour * 60);

    if(min == 0){
        min = 60;
    }
    else {
        travel_time = ((1.0 * travel_days * hour) * (min / 60));
        DecimalFormat decimalFormat = new DecimalFormat("#.0");
        travelTime = Double.parseDouble(decimalFormat.format(travel_time));
    }


    weightMap = new LinkedHashMap<Integer, Double>(); //store weight
    int totalPriority = 0;//total priority

    final Destination start = new Destination(116.32133, 39.92269);


    final HashMap<Integer, Integer> pMap = new HashMap<Integer, Integer>();
    final HashMap<Integer, String> nameMap = new HashMap<Integer, String>();
    final HashMap<Integer, Destination> objectMap = new LinkedHashMap<Integer, Destination>();
    /**
     * get the data from cloud database
     */
            BmobQuery<Destination> query = new BmobQuery<Destination>();
            for (int sid: selectedID) {

                query.addWhereEqualTo("id", sid);


                query.findObjects(new FindListener<Destination>() {

                    @Override
                    public void done(List<Destination> list, BmobException e) {
                        if (e == null) {
                            System.out.println("success:total" + list.size() + "items。");
                            for (Destination destination : list) {


                                int p = destination.getPriority();

                                int id = destination.getId();

                                String name = destination.getName();

                                double longitude = destination.getLongitude();
                                double latitude = destination.getLatitude();

                                objectMap.put(id, new Destination(longitude, latitude));

                                System.out.println(id);


                                double dis = DistanceUtil.distance(start.getLongitude(), start.getLatitude(),
                                        longitude, latitude);

                                pMap.put(id, p);
                                weightMap.put(id, new Double(dis));
                                nameMap.put(id, name);

                            }
                        } else {
                            Log.i("bmob", "error:" + e.getMessage() + "," + e.getErrorCode());
                        }
                    }
                });
            }


    for (Integer key : pMap.keySet()) {
        int p = pMap.get(key).intValue();
        totalPriority = totalPriority + p;
    }


    double weight = 0.0;
    for (Map.Entry<Integer, Double> hm : weightMap.entrySet()) {
        double hm2Value = pMap.get(hm.getKey());
        weight = totalPriority / hm.getValue() * hm2Value;

        weightMap.put(hm.getKey(), weight);
    }


    /**
     * 按照weight值来排序
     * 判断是否传递数据给plan_activity
     */
    MapUtil.sortByValue(weightMap);

    //排好序后计算距离
    Iterator it = weightMap.entrySet().iterator();
    int order = 0;
    while (it.hasNext()) {
        order++;
        Map.Entry entry = (Map.Entry) it.next();
        objectMap.put(new Integer(order), objectMap.get(entry.getKey()));
    }


    PlanTask planTask = new PlanTask();//封装了每个plan计算的方法


    for (Map.Entry<Integer, Double> entry : weightMap.entrySet()) {
        System.out.println("id= " + entry.getKey());


        double play_time = planTask.calPlay_time(weightMap.size(),
                weightMap.get(entry.getKey()), travelTime);

        double driving_time = planTask.calDrive_time(DistanceUtil.distance(
                objectMap.get(entry.getKey()).getLatitude(),
                objectMap.get(entry.getKey()).getLongitude(),
                objectMap.get(entry.getKey() + 1).getLatitude(),
                objectMap.get(entry.getKey() + 1).getLongitude()
        ));

        String arrive_time = "hello world";//未完待续

        String place_name = nameMap.get(entry.getKey());

        Plan plan = new Plan(place_name, arrive_time, driving_time, play_time);

        //传递plan对象list
        planList.add(entry.getKey(), plan);
    }

    return planList;

}

}

当我调试它时,我发现在calculate()函数中,输出

When I debug it, I found that in calculate() functions, the output of

  BmobQuery<Destination> query = new BmobQuery<Destination>();
            for (int sid: selectedID) {

                query.addWhereEqualTo("id", sid);


query.findObjects(new FindListener<Destination>() {

                    @Override
                    public void done(List<Destination> list, BmobException e) {
                        if (e == null) {
                            System.out.println("success:total" + list.size() + "items。");
                            for (Destination destination : list) {

                                int p = destination.getPriority();

                                int id = destination.getId();

                                String name = destination.getName();


                                double longitude = destination.getLongitude();
                                double latitude = destination.getLatitude();

                                objectMap.put(id, new Destination(longitude, latitude));

                                System.out.println(id);

                                //calculate the distance
                                double dis = DistanceUtil.distance(start.getLongitude(), start.getLatitude(),
                                        longitude, latitude);

                                pMap.put(id, p);
                                weightMap.put(id, new Double(dis));
                                nameMap.put(id, name);

                            }
                        } else {
                            Log.i("bmob", "error:" + e.getMessage() + "," + e.getErrorCode());
                        }
                    }
                });

是成功:总共1项。在循环之后,如果我选择了3个项目,那就是成功:总共1个项目。 3次,只捕获最后一项的信息。
和三个哈希映射的大小:pMap,nameMap和objectMap都是零。为什么???这很奇怪......

is "success:total 1 items." and after the loop, if I have selected 3 items, it would be "success:total 1 items." for 3 times and only the information of the last item is caught.AND the size of three hash map: pMap, nameMap and objectMap are all zero. Why is it??? It is so strange...

LogCAT中没有错误,但是,有序列表视图无法显示在第二个活动中。请帮助我,它困扰了我很长一段时间。
谢谢!!!

There is no error in LogCAT, however, the ordered list view cannot display in the second activity. PLEASE help me, it has bothered me for a long time.Thank you!!!

推荐答案

我不知道很多,因为我不太满意反应式编程,因为平台通常会使用大量的rxjava,但这里有一些能够稍微增强代码的东西

I couldn't figure out much unfortunately, since I am not really comfortable with reactive programming yet as the platform uses a lot of rxjava in general, but here is something that would enhance the code a little bit

final HashMap<Integer, Integer> pMap = new HashMap<Integer, Integer>();
final HashMap<Integer, String> nameMap = new HashMap<Integer, String>();
final HashMap<Integer, Destination> objectMap = new LinkedHashMap<Integer, Destination>();

/**
 * get the data from cloud database
 */
BmobQuery<Destination> query = new BmobQuery<Destination>();

// this time only one list of three elements is added instead of three lists of one element each
query.addWhereContainedIn("id", Arrays.asList(selectedID));

query.findObjects(new FindListener<Destination>() {
                @Override
                public void done(List<Destination> list, BmobException e) {
                    if (e == null) {
                        System.out.println("success:total" + list.size() + "items。");
                        for (Destination destination : list) {

                            int p = destination.getPriority();

                            int id = destination.getId();

                            String name = destination.getName();


                            double longitude = destination.getLongitude();
                            double latitude = destination.getLatitude();

                            objectMap.put(id, new Destination(longitude, latitude));

                            System.out.println(id);

                            //calculate the distance
                            double dis = DistanceUtil.distance(start.getLongitude(), start.getLatitude(),
                                    longitude, latitude);

                            pMap.put(id, p);
                            weightMap.put(id, new Double(dis));
                            nameMap.put(id, name);

                        }
                        // continue execution here though you won't be able to return a list of plans here
                    } else {
                        Log.i("bmob", "error:" + e.getMessage() + "," + e.getErrorCode());
                    }
                }
});

希望这会有所帮助:)

这篇关于android循环错误 - 无法将值放入hashmap的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-27 22:33
查看更多