중첩된 if 문 제거

임창진의 이미지

어떤 메쏘드가 있는데 이 메쏘드는 파라미터 4개를 전달받아서 결과값 하나를 리턴합니다.
A,B,C,D 네개의 파라미터가 각각 아래표의 값을 가질수 있다고 할때.

조건                        
-------------------------
A       B       C       D   
-------------------------
a1      b1      c1      d1      
a2      b2      c2      d2
a3      b3      c3      d3
a4              c4      d4
                c5

현재 코딩된 소스는 if 문으로 이걸 하나하나 비교해서
결과값을 알아내고 있습니다.

myMethod(A,B,C,D) {
    if(A == a1) {
        if(B == b1) {
            return x1;
        }else(B == b2)  {
            if(C == c1) {
                return x2;
            }else if(...)   {
                .
                .
            }
            .
            .
            .
        }
        .
        .
        .
    }else if(A == a2)   {
    
    
    }
    .
    .
    .
}

중첩된 if문이 싫어서 아래처럼 바꾸려고 합니다.

    Hashtable ht = new Hashtable();
    ht.put( a1 + delim + b1 + delim + c1 + delim + d1 , x1)
    ht.put( a1 + delim + b1 + delim + c1 , delim + d2 , x2)
    ht.put( a1 + delim + b1 + delim + c1 , delim + d3 , x3)
    .
    .
    .
    .
    
    myMethod(A,B,C,D) {
        return ht.get(A + delim + B + delim + C + delim + D)
    }

이 방법말고 더 간편하고 좋은방법이 있을까요?

ixevexi의 이미지

제 꽁수중 하나가 있긴 합니다.

파라미터들의 값이 충분히 작고 integer형일때 쓰는 방법인데요
간단합니다. '진법'개념을 이용하는 것이지요

           A       B      C      D
           1       2       3      4

이런식으로 되어있을때 ABCD (1234) 라는 하나의 큰 수로 만들 수 있습니다.
그런다음 한방에 비교하는 것이지요

위의 식이라면 하나의 숫자로 ABCD를 만든후 switch, case문을 이용해서 만들면 되겠네요

예전에 programming challanges라는 책의 예제에
포카에서 나오는 카드의 승패를 계산할때
제일 큰카드가 같으면 다음 카드가 같고 어쩌구.. 이런 것 쓸때 if쓰기 싫어서
생각해보았떤 방법입니다.

단점은 파라미터의 숫자가 충분히 작아야 진법 만들기가 쉽죠
128진법 이러면 난감하자나요 ^^

C++, 그리고 C++....
죽어도 C++

임창진의 이미지

우선 답변해주셔서 감사합니다.
제가 비교하려는것이 String 이라서 아쉽게도 알려주신방법은 사용하기 어려울거 같습니다.
그냥 원래 아이디어대로 코딩해야 할 거 같습니다.

익명 사용자의 이미지

CNF, DNF를 이용하여 판단하는 방법이 있습니다.
모든 수식을 AND major, OR major로 표현하는 것입니다.
이를 이용하면 쿼리 옵티마이즈 및 어떤 의사결정트리를 구성하는데 좋습니다.

* 과거 검색엔진 관련 프로그램 잠시할때, 사용했었습니다.
* 파라메터의 개수가 많아지면, 해쉬테이블의 증가가 심할것 같은데, 그럴가능성이 없다면(많지 않다면;일정하다거나) 해쉬를 사용하시는 것도 그리 나빠보이지 않습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.