我被要求更改此类中的'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;
答案 0 :(得分:2)
使用int
到Lot
的地图:
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)
使用Map
。 Map
接口有多种实现(例如,参见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可能是一个更好的主意。