0

以下の2つの方法を実装したいと思います。SomeObjectには Date 型のフィールドcreatedDateがあります

private SomeObject getNearestObjectBeforeTargetObjectsCreatedDate(List<SomeObject> someObjectList, SomeObject targetObject){

}


private SomeObject getNearestObjectAfterTargetObjectsCreatedDate(List<SomeObject> someObjectList, SomeObject targetObject){

}

作成日の昇順で 5 つのオブジェクト P1、P2、P3、P4、P5 があるとします。ターゲット オブジェクトが P3の場合、1番目のメソッドは P2を返し、 2 番目のメソッドは P4 を返す必要があります。

現在、私はこのようなものを書いています

private SomeObject getNearestPortFolio(List<SomeObject> someObjectList, SomeObject targetObject){
    SomeObject returnObject = targetObject;

      for(SomeObject someObject : someObjectList) {
        // if the current iteration's date is "before" the target date
          if(someObject.getCreatedDate().compareTo(targetObject.getCreatedDate()) < 0) {

              if (someObject.getCreatedDate().compareTo(returnObject.getCreatedDate()) > 0){
                  returnObject = someObject;
          }

      }
     }
      return returnObject;
    }
4

2 に答える 2

0

このようなことができます。必要に応じて必要な変更を加えてください。ただし、コア ロジックは変わりません。

// Note that if the target is the first element, this will return null.
private static String getNearestBefore(List<String> test, String target) {
    String returnObj = null;
    String previous = null;
    for (String someObj : test) {
        if (someObj.equals(target)) { //Insert your condition here
            returnObj = previous;
        }
        previous = someObj;
    }
    return returnObj;
}

// Note that if the target is the last element, this will return null.
private static String getNearestAfter(List<String> test, String target) {
    String returnObj = null;
    boolean nextSatisfied = false;
    for (String someObj : test) {
        if (nextSatisfied) {
            returnObj = someObj;
            break;
        }
        if (someObj.equals(target)) { //Insert your condition here
            nextSatisfied = true;
        }
    }
    return returnObj;
}
于 2013-04-09T05:42:17.607 に答える
0

次のコードを目的に合わせて調整してください。に相当しgetNearestObjectAfterます。この関数は、 target より大きい次の要素のインデックスを返しますkeykeyが対象リストに含まれている必要はありません。ターゲット リストはソートする必要があります。

public static <T extends Comparable<? super T>> int upperBound(List<T> list, T key)
{
  int index = Collections.binarySearch(list, key);
  return (0 <= index) ? upperBound(list, key, index) : -index - 1;
}

protected static <T extends Comparable<? super T>> int upperBound(List<T> list, T key, int index)
{
  // -- PRE: 0 <= index < size

  int size = list.size();
  if (list instanceof RandomAccess)
  {
    while (   (++index < size)
           && (0 == list.get(index).compareTo(key)))
    {
      // -- nothing additional to do
    }
  }
  else
  {
    for ( ListIterator<? extends T> I = list.subList(++index, size).listIterator()
        ; I.hasNext()
        ; )
    {
      if (0 == I.next().compareTo(key))
      {
        ++index;
      }
      else
      {
        break;
      }
    }
  }

  return index;
}

これら 2 つのメソッドには、「比較できない」オブジェクトへの自然な拡張があります。

public static <T> int upperBound(List<? extends T> list, T key, Comparator<? super T> comparator)
{
  int index = Collections.binarySearch(list, key, comparator);
  return (0 <= index) ? upperBound(list, key, index, comparator) : -index - 1;
}

protected static <T> int upperBound(List<? extends T> list, T key, int index, Comparator<? super T> comparator)
{
  // -- PRE: 0 <= index < size

  int size = list.size();
  if (list instanceof RandomAccess)
  {
    while (   (++index < size)
           && (0 == comparator.compare(list.get(index), key)))
    {
      // nothing additional to do
    }
  }
  else
  {
    for ( ListIterator<? extends T> I = list.subList(++index, size).listIterator()
        ; I.hasNext()
        ; )
    {
      if (0 == comparator.compare(I.next(), key))
      {
        ++index;
      }
      else
      {
        break;
      }
    }
  }

  return index;
}
于 2013-04-09T05:54:21.807 に答える