不依赖于存储在索引处的数字。方法帮助

时间:2010-12-07 20:25:05

标签: java

我被要求更改此类中的'getlot'方法,以便它不依赖于很多特定数字作为集合中索引[number -1]的存储。例如,如果批次#3被删除,则批次#4将从索引3更改为2.我尝试重新编码但无济于事。任何帮助表示赞赏。这是我试图改变的代码方法。 (很多是数组列表的一部分)谢谢

    public Lot getLot(int lotNumber)
    {
    if((lotNumber >= 1) && (lotNumber < nextLotNumber)) {
        Lot selectedLot = lots.get(lotNumber - 1);
        if(selectedLot.getNumber() != lotNumber) {
            System.out.println("Internal error: Lot number " +
                               selectedLot.getNumber() +
                               " was returned instead of " +
                               lotNumber);
            selectedLot = null;
        }
        return selectedLot;
    }
    else {
        System.out.println("Lot number: " + lotNumber +
                           " does not exist.");
        return null;

4 个答案:

答案 0 :(得分:2)

使用intLot的地图:

Map<Integer, Lot> lots = new HashMap<Integer, Lot>();

public Lot getLot(int lotNumber) {
    return lots.get(lotNumber);
}

您可以添加一些简化方法:

public void addLot(Lot lot) {
    if (lots.containsKey(lot.getNumber()) 
        throw new IllegalArgumentException("Lot " + lot + " already added");

    lots.put(lot.getNumber(), lot);
}

public void removeLot(int lotNumber) {
    if (lots.containsKey(lot.getNumber()) 
        throw new IllegalArgumentException("Lot with " +lotNumber+ " not added");

    return lots.remove(lotNumber); // will also return the lot 
} 

答案 1 :(得分:0)

假设继续存储批次,我建议进行二元搜索。

答案 2 :(得分:0)

使用MapMap接口有多种实现(例如,参见http://download.oracle.com/javase/6/docs/api/java/util/Map.html),您可以根据需要支持的其他操作进行选择。

答案 3 :(得分:0)

如果你有一个Lots的排序列表,你可以使用[二分搜索]来找到它。1

public Lot getLot(int lotNumber) {
    int index = Collections.binarySearch(lots, new Lot(lotNumber));
    if (index >= 0) {
        return lots.get(index);
    }
    else {
        System.out.println("Failed to find lot " + lotNumber);
        return null;
    }    

}

这假设Lot很容易用int实例化并实现Comparable。否则你可以创建一个比较器。

public class LotComparator implements Comparator {
    public int compare(Object o1, Object o2) {
        int num1 = generateInt(o1);
        int num2 = generateInt(o2);
        return num1 - num2;
    }

    private int generateInt(Object o) {
       if (o instanceof Lot) {
            Lot l = (Lot) o;
            return l.getNumber();
       }
       else {
            Integer i = (Integer) o;
            return i;
       }
}

正如其他人建议使用从整数(lotNumber)到Lot的Map可能是一个更好的主意。