Бір мәнді қайтару қажет болған кезде бос көрсеткіштен аулақ болыңыз

Біріншіден, нөлдік көрсеткіш бойынша қойма ағыны туралы сұрақтар бар, бірақ бұл мүмкін емес. Ол бар болған, мен оны таппадым, содан кейін менің қателігімді сақтап қойыңыз.

Сұрақ жалпы - егер функция бір элементті қайтарса, ол жоғалған «элемент» ісімен қалай айналысуға болады. Мысалы: үлгі коды - тек үлгі.

public int findSmallestNumberGreaterThanX(int a[], int x) {
 //do what ever logic.
  if (numFound) { return smallesNumberGreaterThanX; }
  else {
    //what ??
   }
}

Егер массивте x артық емес болса, не істеу керек?

  1. Тиімді java сөздері нөлдік көрсеткіштің орнына бос массаны қайтарады - бірақ функция бір элементті қайтарса, массив құру керек пе?

  2. Келесі опция нөлге тең болады.

  3. Үшіншіден, объектіні қайтару {boolean found; int мәні; }. Бұл өте жоғары деңгейге ұқсайды.

Пожалуйста, маған мұнда жақсы ұсыныс.

3
Мен стека толтыру бойынша басқа мәселелер бойынша зерттелген барлық опцияларды айттым. Аралас жауаптар бар - ешкім осы нақты сценарийді тікелей қарастырмайды - кешірім сұрайды, бірақ ешқандай қорытындыға қол жеткізе алмады.
қосылды автор JavaDeveloper, көзі
smallesNumberGreaterThanX кез келген жағдайда x болады ма?
қосылды автор Vishal K, көзі

7 жауаптар

Бұл сіздің функцияңыздың қайтаратынына байланысты. Егер ол мәнді қайтарса, онда кез келген мән жарамды, сондықтан қайтару мәні жарамдылықты бақылау үшін пайдаланылмайды.

Егер массивте табылған мәннің индексін қайтарсаңыз, онда нөлден төмен нәрсе заңсыз мән ретінде қарастырылуы және қате коды үшін пайдаланылуы мүмкін.

Мүмкін сіз қайтару мәніңізді қамтитын параметрді қосып, функцияны нөмірдің табылғанын немесе көрсетілмегенін көрсететін логикалық мәнді қайтаратын етіп өзгерте аласыз.

3
қосылды

Егер салыстыру қатаң болса, сіз Integer.MIN_VALUE мәнін қайтара аласыз, себебі ол басқа жолмен қайтарылмайтын жалғыз мән. (ол өзінен басқа барлық басқа мәндерден аз).

3
қосылды
Бұл жағдайда Integer.MIN_VALUE «sentinel» мәні ретінде әрекет етеді.
қосылды автор Raedwald, көзі
және егер x == Integer.MIN_VALUE?
қосылды автор Elazar, көзі
+1, бірақ сіз неге түсіндіресіз, бұл опция бұл сұрақтың ішіндегі басқа параметрлерден гөрі ең жақсы.
қосылды автор Vulcan, көзі

Мен бұл мәселені шешудің бірнеше жолын көремін. Мен (1) немесе (2) пайдалануды ұсынамын және (3) және (4) болдырмауды ұсынамын.

(1): алып тастау. Сіздің әдісіңіз келесідей болады:

public int findSmallestNumberGreaterThanX(int a[], int x)
    throws NoSuchNumberException {
 //do what ever logic.
  if (numFound) { return smallestNumberGreaterThanX; }
  else {
    throw new NoSuchNumberException();
   }
}

және айтуға болады

try {
  int smallestNum = findSmallestNumberGreaterThanX(a, x);
  //use smallestNum
} catch(NoSuchNumberException e) {
  //handle case where there is no smallestNum
}

Сондай-ақ, сіз NoSuchNumberException класын жасауыңыз керек еді:

public class NoSuchNumberException extends Exception {

  public NoSuchNumberException() {}

  public NoSuchNumberException(String message) {
    super(message);
  }
}


(2): Slightly refactor your code.

Барлығын бір әдіспен орындағанның орнына, әдіс жасаңыз

public int findSmallestNumber(int a[]) {...}

сосын айтыңыз

int smallestNum = findSmallestNumber(a);
if (smallestNum > x) {
  //use smallestNum
} else {
  //handle case where there is no smallestNum > x
}


(3): Set your return type to Integer, and return null. Java will automatically cast between int and Integer, and null is a valid value for Integer. Just be sure to check for null wherever you use this method, because if you try to cast null to an int, it will break.


(4): return a number less than x. (I strongly recommend you do not use this solution unless you can also use that number somehow.) Since the number is less than x, it can be identified as an error condition.

3
қосылды
Рахмет - бірақ опциялардың біреуі Ең көп ұсынылған. Жалпы жағдайда «бірегей нысан», «құбылмалы», «коллекция емес» деген нәрсе қайтарылуы керек элемент болды ма? Мен
қосылды автор JavaDeveloper, көзі
Кейде құрылымдық тұрғыдан стандартты емес әдіс жоқ, ерекше жағдайларды ерекше көремін (ешқандай арнайы сиқырлы сандар), бірақ ерекше жағдайлар өте қымбат, сондықтан іс жүзінде әдетте w -1 немесе нөлді (бастапқы немесе қайталанатын объект)
қосылды автор Richard Tingle, көзі
@JavaDeveloper Мен айтқым келеді (1) немесе (2) ұсынылады. Бағдарламаны құрылымдау кезінде міндетті түрде дұрыс жауап жоқ. Бірақ сіз кез келген нәрсені қайтара алатын жалпы әдісті жасасаңыз, оны қайта қарастырғыңыз келуі мүмкін. Нақты не екенін білмейінше, нәтиже жарамсыз болады (немесе егер сіз көптеген мәлімдемелерді қолданбасаңыз, бірақ бұл жалпыға түсініксіз болса).
қосылды автор Martin Wickham, көзі

Әлі айтылмаған тағы бір шешім - сәтсіздікке ұшыраған құндылықтарды білдіретін арнайы класс болуы. Біздің жобаларымыздың бірінде бізде болды

public interface Option
    extends java.util.Collection
{
   //Throws an exception if empty.
    public T get();
   //Returns `deflt` if empty.
    public T getOrElse(T deflt);
    public boolean isEmpty();
}

Option represents either a single value of type T or no value. (It implements Collection so that it can be viewed as a collection of 0 or 1 elements, which allows you to use it for example in for comprehensions, but it's probably not important for your case.) It had two subclasses, one representing an empty Option және one representing a full one:

// ---

public final class None
    extends AbstractCollection
    implements Option
{
    public None() {}
   //...
}

және

public final class Some
    extends AbstractCollection
    implements Option
{
    private final T value;

    public Some(T value) {
        this.value = value;
    }

   //...
}

Толық код мұнда бар. Бұл тек Scala ның Option класының нұсқасы.

Сіздің жағдайыңызда оны пайдаланғыңыз келеді

public Option findSmallestNumberGreaterThanX(int a[], int x) {
 //do what ever logic.
  if (numFound) { return new Some(smallesNumberGreaterThanX); }
  else { return new None(); }
}

Creating such an object has negligible overhead (unless you create millions of them), және gives a nice semantic distinction between a successful және a failed operation.

2
қосылды
Жақсы естіледі .. бірақ 3-нұсқаға қарағанда, ол қалай ерекшеленеді? Үшіншісі - объектіні қайтару; int мәні; }. Бұл көпшілікке ұқсас. Интерфейс пен 2 сыныпты орнына бір сыныпты қайтаратын болар едік?
қосылды автор JavaDeveloper, көзі
@JavaDeveloper Ұқсас, сіз ұсынғандай Option енгізе аласыз. Бұл нұсқа полиморфты болып табылады, сондықтан оны кез-келген мақсатта пайдалануға болады. Бұл әбден мүмкін емес, себебі іске асырудың егжей-тегжейі маңызды емес. Оның орнына null с болдырмау және Option <...> қолданыңыз, қандай мәндер міндетті емес және қандай мәндер қажет екенін әрдайым анық болады. Мұнда - Scala-ның Option үшін жақсы оқу құралы.
қосылды автор Petr Pudlák, көзі

Әлі әлі айтылмаған тағы бір шешім бар:

Instead of returning the element itself, return its index. If there is no such element, either return -1 or the array size. This approach is quite common in C++ with iterators.

2
қосылды

Егер smallesNumberGreaterThanX өзіне x кірмесе, онда сіз келесідей бірдеңені пайдалана аласыз:

public int findSmallestNumberGreaterThanX(int a[], int x) {
 //do what ever logic.
  if (numFound) { return smallesNumberGreaterThanX; }
  else {
     return x;
   }
}

Сіз бұл әдісті қолданған кезде оны келесідей қолдануға болады:

int var = findSmallestNumberGreaterThanX(a ,x);
if (var == x)
{
    System.out.println("No value found");
}
2
қосылды
Егер integer.MIN_VALUE тең болса, бұл дұрыс шешім емес
қосылды автор sasha.sochka, көзі

Нөлді «табылған жоқ» нәтижеге қайтару өте жиі кездеседі. Integer.MIN_VALUE сияқты «арнайы» мәнді қайтару дұрыс, себебі математикалық түрде бұл заңды нәтиже емес, бірақ ол қоңырау шалушы үшін қарастырылмайтын тәсіл.

Сізде екі нұсқа бар:

  1. Егер табылмаса Ерекшелікті тастау
  2. Нысан түріне қайтару түрін өзгертіңіз және нөлдік мәнді қайтарыңыз

1-опция әдетте жақсы идея емес, бірақ егер сіз оны толықтай қайтарсаңыз, оны қолданыңыз

2-нұсқа - javadoc арқылы құжатталған неғұрлым кең тараған шешім

/**
 * @returns null if not found
 */
public Integer findSmallestNumberGreaterThanX(int a[], int x) {
   //do what ever logic.
    if (numFound)
        return smallesNumberGreaterThanX;
    return null;
}
0
қосылды
@DonRoby oops! Осы сөйлескеннен кейін мен ең маңызды өзгерістерді ұмытып кеттім. Қазір бекітілген. Рахмет
қосылды автор Bohemian, көзі
Жауап мәтінінде көрсетілген үлгі кодының ішінде integer дегенге int өзгерткіңіз келуі мүмкін.
қосылды автор Don Roby, көзі