-2

こんにちは、私はこれを修正しようとしてきましたが、修正できませんでした。問題は、削除がハッシュマップで機能していないことです。

以下のコードをご覧ください。

 package com.org.common;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@SuppressWarnings("unused")
class Workindays {
    public static int findNoOfDays(int year, int month, int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, day);
        int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        return days;
    }
    public static Map<String, String> getHolydaysMap(int year, int month, int day) {
        //connect with database and check whether the date is holyday query is = SELECT * FROM holiday_calendar h WHERE date >='2008-10-01' AND date <='2008-10-30' AND type='Fixed';
        Map<String, String> holydaysMap = new LinkedHashMap<String,String>(); 

        holydaysMap.put("20","17-04-2012");
        holydaysMap.put("10","25-04-2012");
        return holydaysMap;
    }
    public static Map<String, String> getWorkingDaysMap(int year, int month, int day){
        int totalworkingdays=0,noofdays=0;
        String nameofday = "";
        ConcurrentHashMap<String,String> workingDaysMap = new ConcurrentHashMap<String,String>();
        Map<String,String> holyDayMap = new LinkedHashMap<String,String>();
        noofdays = findNoOfDays(year,month,day);
        holyDayMap = getHolydaysMap(year,month,day);

        for (int i = 1; i <= noofdays; i++) {
            Date date = (new GregorianCalendar(year,month - 1, i)).getTime(); // year,month,day
            SimpleDateFormat f = new SimpleDateFormat("EEEE");
            nameofday = f.format(date);
            String formatedDate = i+"-"+month+"-"+year;
            if(!(nameofday.equals("Saturday") || nameofday.equals("Sunday"))){
                workingDaysMap.put(String.valueOf(i),formatedDate);
                totalworkingdays++;
            }
        }
        workingDaysMap.put("totalworkingdays", String.valueOf(totalworkingdays));

        System.out.println("removeHolyday : "+removeHoliday(workingDaysMap,holyDayMap));
        return workingDaysMap;
    }
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static Map removeHoliday(ConcurrentHashMap daysMap, Map holydayMap) {
        Iterator<Map.Entry> holyDayiterator = holydayMap.entrySet().iterator();
        while (holyDayiterator.hasNext()) {
            Map.Entry holyDayEntry = holyDayiterator.next();

            Iterator<Map.Entry> daysiterator = daysMap.entrySet().iterator();
            while (daysiterator.hasNext()) {
                Map.Entry daysEntry = daysiterator.next();
                 if(daysEntry.getKey().equals(holyDayEntry.getKey()))
                      daysMap.remove(holyDayEntry.getKey());
            }
        }
        return daysMap;
    }
    @SuppressWarnings({ "rawtypes" })
    public static void main(String[] args) {
        String delimiter = null, dateValues[] = null, startDate = "01-04-2012";
        int year = 0,month=0,day=0,totalworkingdays = 0;
        Map workingDaysMap = new LinkedHashMap<String,String>();

        startDate = "01-04-2012";
        delimiter = "-";
        dateValues = startDate.split(delimiter);

        year = Integer.parseInt(dateValues[2]);
        month = Integer.parseInt(dateValues[1]);
        day = Integer.parseInt(dateValues[0]);

        workingDaysMap = getWorkingDaysMap(year, month, day);
        //System.out.println("workingdays map : "+workingDaysMap);

    }
}

これは、値を削除するために呼び出すメソッドです

removeHolyday

次のメソッドでテストするサンプル値を指定しました。

getHolydaysMap

助けてください。

編集:貴重な時間を割いて回答、賛成票、反対票を投じてくれたすべての人に感謝します。コードを変更しましたが、現在は正常に機能しています。

作業コードを更新しました。

よろしくアントニー

4

5 に答える 5

2
  if (Integer.parseInt(daysEntry.getKey().toString()) ==   Integer.parseInt(holyDayEntry.getKey().toString()))
                daysMap.remove( Integer.parseInt(holyDayEntry.getKey().toString()));
            break;

条件が失敗した場合、マップの残りの部分をループする代わりにブレークアウトします

于 2012-05-22T11:26:50.347 に答える
2

発生している特定のエラーについては述べていませんが、一般的なコメントがいくつかあります。

break ステートメントは「if」の外側にあるため、コードが通過し、最初のキーの後に while ループを終了します。つまり、実際にはすべてのキーを繰り返し処理しているわけではありません。

第 2 に、マップを反復して一致するキーをテストする必要はありません。いずれにせよ、remove を呼び出すとこれが実行されます。

3 番目に (興味深い点として) 反復処理中にマップからアイテムを削除すると、次回のループで反復子から例外が発生します。この特定のケースでは、break ステートメントがエラーに到達するのを防ぐため、強調表示されていませんが、将来のために注目する価値があります。

于 2012-05-22T11:27:17.793 に答える
1

removeHoliday メソッドでは、括弧が必要です。以下が必要です。

if (Integer.parseInt(daysEntry.getKey().toString()) == Integer.parseInt(holyDayEntry.getKey().toString())) {
    daysMap.remove( Integer.parseInt(holyDayEntry.getKey().toString()));
    break;
}

それ以外の

if (Integer.parseInt(daysEntry.getKey().toString()) ==     Integer.parseInt(holyDayEntry.getKey().toString()))
    daysMap.remove( Integer.parseInt(holyDayEntry.getKey().toString()));
break;
于 2012-05-22T11:28:14.680 に答える
1

removeHolydays次のように書き直すことを検討してください。

それ以外の

  public static Map removeHolyday(Map daysMap, Map holydayMap) {
    Iterator<Map.Entry> holyDayiterator = holydayMap.entrySet().iterator();
    while (holyDayiterator.hasNext()) {
        Map.Entry holyDayEntry = holyDayiterator.next();
        Iterator<Map.Entry> daysiterator = daysMap.entrySet().iterator();

        while (daysiterator.hasNext()) {
            Map.Entry daysEntry = daysiterator.next();
            if (Integer.parseInt(daysEntry.getKey().toString()) == Integer.parseInt(holyDayEntry.getKey().toString()))
                daysMap.remove( Integer.parseInt(holyDayEntry.getKey().toString()));
            break;
        }
    }
    return daysMap;
}

そのはず:

public static Map<Integer, String> remove(Map<Integer, String> daysMap, Map<Integer, String> holydayMap){
     for(Integer i : holydayMap.keySet())
         daysMap.remove(i);
     return daysMap;
}

breakこれにより、指摘されたように間違った場所にあるというエラーが取り除かれますejb_guy

于 2012-05-22T11:29:03.310 に答える
0

これを行うには、ConcurrentHashMapを使用できます。

public static Map removeHolyday(ConcurrentHashMap daysMap、Map holydayMap){

編集:次のコードを使用して、

public static Map removeHoliday(ConcurrentHashMap daysMap, Map holydayMap) {
        Iterator<Map.Entry> holyDayiterator = holydayMap.entrySet().iterator();
        while (holyDayiterator.hasNext()) {
            Map.Entry holyDayEntry = holyDayiterator.next();
            if(daysMap.containsKey(holyDayEntry.getKey())){
                daysMap.remove(holyDayEntry.getKey());
            }
        }
        return daysMap;
    }
于 2012-05-22T11:55:04.317 に答える