计算最便宜排列的算法

时间:2016-06-15 09:57:52

标签: java android algorithm

我正在为应用创建一个功能,用户提供一些项目和应用,然后应用从数据库中获取价格。这些价格放在地图中,异步任务完成后,排列功能开始。它是什么意思来做基于根据用户的输入而改变的组合的所有排列。我得到ava.lang.NullPointerException:尝试调用虚方法'int java.lang.Integer.intValue()'在null对象referenceMy代码如下:

latest.java

public class latest extends AppCompatActivity {
    String major = "";
    TextView textView;
    public static Map<String,Map<String,Integer>> cart_names = new HashMap<>();
    public static Map<String,Map<String,Integer>> cart_names2 = new HashMap<>();
    ProgressDialog pd;
    ArrayList<String> strhold = new ArrayList<String>();
    Activity context;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_latest);
        Toolbar toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        textView = (TextView) findViewById(R.id.main_text);
        context=this;
        for (int s=0;s<Search_multiple.cart_records.size();s++){
            strhold.add(Search_multiple.cart_records.get(s).getName());
        }
        if (strhold.size()>0) {
            BackTask backTask = new BackTask();
            backTask.execute(strhold);
        }


    }
    @Override
    public void onStart(){
        super.onStart();
        String arr[]={};

         }
    public void goto_main_confirm(View view) {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

    /* public static void setCart_records(Items item){
         cart_records.add(item);


     }*/
    public void goto_cart_confirm(View view) {
        Intent someintent = new Intent(this, CartActiviy.class);
        startActivity(someintent);
    }
    private class BackTask extends AsyncTask<ArrayList<String>, Void, Void> {
        protected void onPreExecute() {

            super.onPreExecute();

            pd = new ProgressDialog(context);

            pd.setTitle("Retrieving data");

            pd.setMessage("Please wait.");

            pd.setCancelable(true);

            pd.setIndeterminate(true);

            pd.show();


        }

        protected Void doInBackground(ArrayList<String>... arg0) {
            InputStream is = null;
            String result = "";
            try {
                ArrayList<String> name = arg0[0];
                String link = "http://chutte.co.nf/get_item_prices.php?";
                for (int b = 0; b < name.size(); b++) {
                    link += "names[]" + "=" + name.get(b);
                    if (b != name.size() - 1) {
                        link += "&";
                    }
                }
                Log.e("ERROR", link);
                URL url = new URL(link);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                is = urlConnection.getInputStream();
            } catch (Exception e) {
                if (pd != null)

                    pd.dismiss();

                Log.e("ERROR", e.getMessage());
            }
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                StringBuilder builder = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    builder.append(line + "\n");

                }
                is.close();
                result = builder.toString();
            } catch (Exception e) {
                Log.e("ERROR", "Error converting result " + e.toString());
            }
            try {
                result = result.substring(result.indexOf("["));
                JSONArray jsonArray = new JSONArray(result);
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    Map<String, Integer> temmap = new HashMap<>();
                    String temname = jsonObject.getString("Name");
                    temmap.put("First", jsonObject.getInt("First"));
                    strhold.add("First");
                    temmap.put("Second", jsonObject.getInt("Second"));
                    strhold.add("Second");
                    temmap.put("Third", jsonObject.getInt("Third"));
                    strhold.add("Third");
                    Log.e("ERROR", temmap.get("First").toString());
                    cart_names.put(temname, temmap);
                }
            } catch (Exception e) {
                Log.e("ERROR", "Error pasting data " + e.toString());
            }
            return null;
        }

        protected void onPostExecute(Void result) {

            if (pd != null) pd.dismiss();
            Log.e("size", cart_names.size() + " ");
            if (cart_names.size() == 0) {
                textView.setText("Sorry, Error applying data \n" + "Please contact customer service........");
            } else {
                    String[] strhold1 = new String[strhold.size()];
                    for (int i = 0; i < strhold.size(); i++) {
                        strhold1[i] = strhold.get(i);
                    }
                    Combination.printCombination(strhold1, strhold.size(), 2);

                }


        }
    }
}

Combination.java

Public class Combination {
    /* arr[]  ---> Input Array
        data[] ---> Temporary array to store current combination
        start & end ---> Staring and Ending indexes in arr[]
        index  ---> Current index in data[]
        r ---> Size of a combination to be printed */
    public static ArrayList<String> finalmap = new ArrayList<>();
    public static void combinationUtil(String arr[], String data[], int start,
                                int end, int index, int r)
    {
        // Current combination is ready to be printed, print it
        if (index == r)
        {
            ArrayList<String> stringArrayList = new ArrayList<String>();
            for (int j=0; j<r; j++)
                stringArrayList.add(data[j]);
            permute(stringArrayList,0);

            return;
        }

        // replace index with all possible elements. The condition
        // "end-i+1 >= r-index" makes sure that including one element
        // at index will make a combination with remaining elements
        // at remaining positions
        for (int i=start; i<=end && end-i+1 >= r-index; i++)
        {
            data[index] = arr[i];
            combinationUtil(arr, data, i+1, end, index+1, r);
        }
    }

    // The main function that prints all combinations of size r
    // in arr[] of size n. This function mainly uses combinationUtil()
    public static void printCombination(String arr[], int n, int r)
    {
        // A temporary array to store all combination one by one

        String data[]=new String[r];
        for(int no = 0;no<arr.length;no++){
            boolean decider = true;
                for (Map.Entry<String,Map<String,Integer>> entry : latest.cart_names.entrySet()){
                    if(latest.cart_names.get(entry.getKey()).get(arr[no])==0){
                        decider=false;
                    }
                }
            if (finalmap.size()==0) {
                if (decider) {
                    for (int rt = 0; rt < latest.cart_names.size(); rt++) {
                        finalmap.add(arr[no]);
                    }
                }
            }else{
                if (decider) {
                    int sum1 = 0;
                    int sum2 = 0;
                    for (Map.Entry<String, Map<String, Integer>> entry : latest.cart_names.entrySet()) {
                        sum1 += latest.cart_names.get(entry.getKey()).get(finalmap);
                        sum2 += latest.cart_names.get(entry.getKey()).get(arr[no]);
                    }
                    if (sum2>sum1){
                        for (int rt = 0; rt < latest.cart_names.size(); rt++) {
                            finalmap.add(arr[no]);
                        }
                    }
                }

                }
        }
        // Print all combination using temprary array 'data[]'
        combinationUtil(arr, data, 0, n-1, 0, r);
    }
        public static void permute(ArrayList<String> arr, int k){
            for(int i = k; i < arr.size(); i++){
                java.util.Collections.swap(arr, i, k);
                /*int sum1 = 0;
                int sum2 = 0;
                int man = 0;
                for (Map.Entry<String, Map<String, Integer>> entry : latest.cart_names.entrySet()) {
                    sum1 += latest.cart_names.get(entry.getKey()).get(finalmap);
                    sum2+=latest.cart_names.get(entry.getKey()).get(arr.get(man));
                    man++;
                }
                if (sum2>sum1){
                    for (int rt = 0; rt < latest.cart_names.size(); rt++) {
                        finalmap.add(arr.get(rt));
                    }
                }*/
                permute(arr, k+1);
                java.util.Collections.swap(arr, k, i);
               /* for (Map.Entry<String, Map<String, Integer>> entry : latest.cart_names.entrySet()) {
                    sum1 += latest.cart_names.get(entry.getKey()).get(finalmap);
                    sum2+=latest.cart_names.get(entry.getKey()).get(arr.get(man));
                    man++;
                }
                if (sum2>sum1){
                    for (int rt = 0; rt < latest.cart_names.size(); rt++) {
                        finalmap.add(arr.get(rt));
                    }
                }
            }
            if (k == arr.size() -1){
                for(int woman = 0;woman<finalmap.size();woman++) {
                    System.out.println(finalmap.get(woman));
                }*/
            }
        }
}

日志

6-15 15:06:41.850 3538-3538/nf.co.riaah.chutte D/AndroidRuntime: Shutting down VM
--------- beginning of crash
06-15 15:06:41.850 3538-3538/nf.co.riaah.chutte E/AndroidRuntime: FATAL EXCEPTION: main
Process: nf.co.riaah.chutte, PID: 3538
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
at nf.co.riaah.chutte.Combination.printCombination(Combination.java:54)
at nf.co.riaah.chutte.latest$BackTask.onPostExecute(latest.java:173)
at nf.co.riaah.chutte.latest$BackTask.onPostExecute(latest.java:83)
at android.os.AsyncTask.finish(AsyncTask.java:636)
at android.os.AsyncTask.access$500(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:139)
at android.app.ActivityThread.main(ActivityThread.java:5298)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:950)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
06-15 15:06:41.851 3538-3538/nf.co.riaah.chutte D/AppTracker: App Event: crash
06-15 15:06:41.883 3538-3538/nf.co.riaah.chutte I/Process: Sending signal. PID: 3538 SIG: 9
06-15 15:06:43.255 3918-3918/nf.co.riaah.chutte D/ThreadedRenderer: mThreadGroupCpuId 2 mRenderThreadCpuId 2 affinity

1 个答案:

答案 0 :(得分:0)

看看Combination.java第54行哪个接缝是if(latest.cart_names.get(entry.getKey())。get(arr [no])== 0)(如果我计算正确的话)那么Map中的整数接缝为null。我建议添加一些日志输出或调试以找出问题的确切位置,并检查是否需要添加公牛支票或修复数据。

也许arr[no]为空。 我建议拆分线并进行一些日志输出以找到问题(或使用调试器)

要找出问题的原因,我会替换:
   if(latest.cart_names.get(entry.getKey()).get(arr[no])==0)

  System.err.println("no: "+no);
  String arrayElement=arr[no];
  System.err.println("arrayElement: "+arrayElement);
  Map<String,Integer> outerMapValue = entry.getValue();
  System.err.println("outerMapValue: "+outerMapValue);
  if(outerMapValue.get(arrayElement)==0)

<强>说明:

  • if(latest.cart_names.get(entry.getKey())可以替换为entry.getValue()

  • Map<String,Map<String,Integer>>阅读代码时不是很容易理解。您可以考虑引入一个类型来包装内部Map<String,Integer>