2010-01-28 3 views
4

Colud, пожалуйста, помогите мне в решении этой проблемы?Как я могу подсчитать эти переменные в моей БД?

У меня 4 переменные

  1. XTSM составляет от 0 ~ 200
  2. XTS находится в пределах от 0 ~ 2
  3. XRX 0 ~ 3
  4. XHAN равно 0 ~ 7
  5. ZHTYPE является один из них: (1) TCHF_HLF (2) TCHSD (3) TCHFULL

они связаны с их формой ,

XTSM->XTS->XRX->XHAN->ZHTYPE (Just Logical)

это означает:

  • Каждый XTSM имеет 3 XTS (0-2)
  • Каждые XTS имеет 4 XRX (0-3)
  • Каждый XRX имеет 8 XCHAN (0-7)
  • и Каждая строка имеет тип ZHTYPE

У меня есть файл DB с 14000 строк; в этом файле эти переменные указаны, Например, XTSM находится в диапазоне от 0 до 200, но обычно оно меньше 200 и, например, может быть указано 0 ~ 60, но оно не превышает 200; , и это правда для XTS, XRX и XCHAN, конечно ... поэтому мы должны сделать все переменные динамическими;

это часть файла (например, ОБНОВЛЕНО): http://www.4shared.com/file/210566155/c080d93a/db_online.html

Я хочу, чтобы получить этот вывод? (Я хочу, чтобы показать XTSM и XTS к выходу и в Backgroud должен рассчитать все из них) , пожалуйста, помогите мне

----Type------------------Total---------------------Total of ZHTYPE----------------- 
XTSM:0/XTS:0    in this case is : 29  TCHF_HLF:28 TCHSD:1 TCHFULL:0 
XTSM:0/XTS:1    No. of found 
XTSM:0/XTS:2    No. of found 
XTSM:1/XTS:0    No. of found 
XTSM:1/XTS:1    No. of found 
XTSM:1/XTS:2    No. of found 

я не знаю, но я думаю, что это может быть, это; Нет? Это просто псевдокод:

for(i ; i< (Total of XTSM) ; i++){ 
     for(j ; j< (Total of XTS) ; j++){ 
      for(k ; k< (Total of XRX) ; k++){ 
       for(l ; l< (Total of XCHAN) ; l++) 
        Print(Total of XTSM:x/XTS:y); 
      } 
     } 

} 

Спасибо за вашу помощь ...

+0

Вау, это звучит как COBOL, не Java. –

+0

Пахнет домашней работой ... –

+0

Также пахнет плохим названием, если кто-то действительно выясняет, что здесь задают, может ли он задать этот вопрос правильному названию? –

ответ

3

См. Мое решение ниже. Тестовый файл test1.txt, который вы дали, кажется, имеет некоторые специальные символы в начале файла.

.

Решение

public class Test { 

    public static void main(String[] args) throws IOException { 
     Test test = new Test(); 
     test.execute(); 
    } 

    private static String TYPE_XTSM = "XTSM"; 
    private static String TYPE_XTS = "XTS"; 
    private static String TYPE_XRX = "XRX"; 
    private static String TYPE_XHAN = "XHAN"; 

    private void execute() throws IOException { 
     InputStream in = null; 
     BufferedReader br = null; 
     TreeMap<Integer, TreeMap<Integer, Integer>> xtsmMap = new TreeMap<Integer, TreeMap<Integer, Integer>>(); 
     try { 
      in = Test.class.getResourceAsStream("test1.txt"); 
      br = new BufferedReader(new InputStreamReader(in)); 
      String line; 
      while ((line = br.readLine()) != null) { 
       Record rec = new Record(line); 
       processRecord(xtsmMap, rec); 
      } 
     } finally { 
      if (br != null) { 
       br.close(); 
      } 
     } 
     printResults(xtsmMap); 
    } 

    private void processRecord(
      TreeMap<Integer, TreeMap<Integer, Integer>> xtsmMap, Record rec) { 
     TreeMap<Integer, Integer> xtsMap; 
     if (xtsmMap.containsKey(rec.getXtsm())) { 
      xtsMap = xtsmMap.get(rec.getXtsm()); 
     } else { 
      xtsMap = new TreeMap<Integer, Integer>(); 
      xtsmMap.put(Integer.valueOf(rec.getXtsm()), xtsMap); 
     } 
     if (xtsMap.containsKey(rec.getXts())) { 
      Integer count = xtsMap.get(rec.getXts()); 
      xtsMap.put(Integer.valueOf(rec.getXts()), Integer.valueOf(count 
        .intValue() + 1)); 
     } else { 
      xtsMap.put(Integer.valueOf(rec.getXts()), Integer.valueOf(1)); 
     } 
    } 

    private void printResults(
      TreeMap<Integer, TreeMap<Integer, Integer>> xtsmMap) { 
     System.out.println("Type\t\tTotal"); 
     Set<Integer> xtsmSet = xtsmMap.navigableKeySet(); 
     for (Integer xtsm : xtsmSet) { 
      TreeMap<Integer, Integer> xtsMap = xtsmMap.get(xtsm); 
      Set<Integer> xtsSet = xtsMap.navigableKeySet(); 
      for (Integer xts : xtsSet) { 
       Integer count = xtsMap.get(xts); 
       String outputLine = TYPE_XTSM + ":" + xtsm + "/" + TYPE_XTS 
         + ":" + xts + "\t" + count; 
       System.out.println(outputLine); 
      } 
     } 
    } 

    private static class Record { 

     private Integer xtsm, xts, xrk, xhan; 

     Record(String line) { 
      StringTokenizer st = new StringTokenizer(line, "/"); 
      while (st.hasMoreTokens()) { 
       String token = st.nextToken(); 
       String type = token.substring(0, token.indexOf(":")); 
       String valueStr = token.substring(token.indexOf(":") + 1, token 
         .length()); 
       Integer value = Integer.valueOf(valueStr); 
       if (TYPE_XTSM.equals(type)) { 
        xtsm = value; 
       } else if (TYPE_XTS.equals(type)) { 
        xts = value; 
       } else if (TYPE_XRX.equals(type)) { 
        xrk = value; 
       } else if (TYPE_XHAN.equals(type)) { 
        xhan = value; 
       } 
      } 
     } 

     public Integer getXtsm() { 
      return xtsm; 
     } 

     public Integer getXts() { 
      return xts; 
     } 

     public Integer getXrk() { 
      return xrk; 
     } 

     public Integer getXhan() { 
      return xhan; 
     } 
    } 
} 

.

Выход

 
Type  Total 
XTSM:0/XTS:0 29 
XTSM:0/XTS:1 29 
XTSM:0/XTS:2 29 
XTSM:1/XTS:0 29 
XTSM:1/XTS:1 29 
XTSM:1/XTS:2 29 
XTSM:2/XTS:0 29 
XTSM:2/XTS:1 29 
XTSM:2/XTS:2 29 
XTSM:3/XTS:0 14 
XTSM:3/XTS:1 14 
XTSM:3/XTS:2 14 
XTSM:4/XTS:0 13 
XTSM:4/XTS:1 13 
XTSM:4/XTS:2 13 
XTSM:5/XTS:0 14 
XTSM:5/XTS:1 14 
XTSM:5/XTS:2 14 
XTSM:6/XTS:0 21 
XTSM:6/XTS:1 21 
XTSM:6/XTS:2 21 
XTSM:7/XTS:0 29 
XTSM:7/XTS:1 29 
XTSM:7/XTS:2 29 
XTSM:8/XTS:0 14 
XTSM:8/XTS:1 21 
XTSM:9/XTS:0 21 
XTSM:9/XTS:1 21 
XTSM:9/XTS:2 21 
XTSM:10/XTS:0 14 
XTSM:10/XTS:1 14 
XTSM:10/XTS:2 14 
XTSM:11/XTS:0 14 
XTSM:11/XTS:1 14 
XTSM:11/XTS:2 14 
XTSM:12/XTS:0 14 
XTSM:12/XTS:1 14 
XTSM:12/XTS:2 14 
XTSM:13/XTS:0 29 
XTSM:13/XTS:1 29 
XTSM:13/XTS:2 29 
XTSM:14/XTS:0 29 
XTSM:14/XTS:1 29 
XTSM:15/XTS:0 29 
XTSM:15/XTS:1 29 
XTSM:15/XTS:2 29 
XTSM:16/XTS:0 29 
XTSM:16/XTS:1 29 
XTSM:16/XTS:2 29 
XTSM:17/XTS:0 29 
XTSM:17/XTS:1 29 
XTSM:17/XTS:2 29 
XTSM:18/XTS:0 29 
XTSM:18/XTS:1 29 
XTSM:18/XTS:2 29 
XTSM:19/XTS:0 29 
XTSM:19/XTS:1 29 
XTSM:19/XTS:2 29 
XTSM:21/XTS:0 29 
XTSM:21/XTS:1 29 
XTSM:21/XTS:2 29 
XTSM:22/XTS:0 29 
XTSM:22/XTS:1 29 
XTSM:22/XTS:2 29 
XTSM:23/XTS:0 29 
XTSM:23/XTS:1 29 
XTSM:23/XTS:2 29 
XTSM:24/XTS:0 29 
XTSM:24/XTS:1 29 
XTSM:24/XTS:2 29 
XTSM:25/XTS:0 29 
XTSM:25/XTS:1 29 
XTSM:25/XTS:2 29 
XTSM:26/XTS:0 14 
XTSM:26/XTS:1 14 
XTSM:26/XTS:2 14 
XTSM:28/XTS:0 15 
XTSM:28/XTS:1 15 
XTSM:28/XTS:2 15 
XTSM:29/XTS:0 13 
XTSM:29/XTS:1 13 
XTSM:29/XTS:2 13 
XTSM:30/XTS:0 14 
XTSM:30/XTS:1 14 
XTSM:31/XTS:0 14 
XTSM:31/XTS:1 13 
XTSM:31/XTS:2 13 
XTSM:32/XTS:0 13 
XTSM:32/XTS:1 14 
XTSM:32/XTS:2 13 
XTSM:33/XTS:0 14 
XTSM:33/XTS:1 14 
XTSM:33/XTS:2 14 
XTSM:34/XTS:0 14 
XTSM:34/XTS:1 14 
XTSM:34/XTS:2 14 
XTSM:35/XTS:0 29 
XTSM:35/XTS:1 29 
XTSM:35/XTS:2 29 
XTSM:36/XTS:0 29 
XTSM:36/XTS:1 21 
XTSM:36/XTS:2 21 
XTSM:37/XTS:0 14 
XTSM:37/XTS:1 14 
XTSM:37/XTS:2 14 
XTSM:38/XTS:0 14 
XTSM:38/XTS:1 14 
XTSM:38/XTS:2 14 
XTSM:39/XTS:0 21 
XTSM:39/XTS:1 21 
XTSM:39/XTS:2 21 
XTSM:40/XTS:0 29 
XTSM:40/XTS:1 29 
XTSM:40/XTS:2 7 
XTSM:41/XTS:0 29 
XTSM:41/XTS:1 29 
XTSM:41/XTS:2 29 

+0

Дорогой Гладвин Спасибо большое; это превосходно ... – Freeman

+0

Дорогой Gladwin это последний запрос :) Я обновляю свой вопрос, потому что я не могу обработать его colud, пожалуйста, скажите мне, как я могу создать этот вывод? я обновить файл базы данных, вы можете скачать его ... большое спасибо, действительно ... У меня есть 3 типа XHTYPE = 1) TCHF_HLF 2) TCHSD 3) TCHFULL – Freeman

1

Это не делает много смысла, чтобы сделать это в Java, так как то, что вы показываете только запись и обработка минимальное текстовое манипулирование. Как указал Калеб Бразе в комментарии автора, COBOL может быть уместным. Но я не знаю COBOL.

Вот быстрое решение Perl:

my $records = {}; 

for (<>) { 
    next unless m{XTSM:(\d+)/XTS:(\d+)/XRX:(\d+)/XHAN:(\d+)}; 
    $$records{"XTSM:$1/XTS:$2"} ||= []; 
    push @{$$records{"XTSM:$1/XTS:$2"}}, "$3/$4"; 
} 

print "Type\t\t\tTotal\n"; 

for (sort keys %$records) { 
    print "$_\t\t" . scalar @{$$records{$_}} . "\n"; 
} 

Пример вывода с помощью прилагаемого файла:

Type     Total 
XTSM:0/XTS:0   29 
XTSM:0/XTS:1   29 
XTSM:0/XTS:2   29 
XTSM:1/XTS:0   29 
XTSM:1/XTS:1   29 
XTSM:1/XTS:2   29 
XTSM:10/XTS:0   14 
XTSM:10/XTS:1   14 
+0

спасибо, но я должен обработать его с помощью java как моего сообщения;) – Freeman

2

Хорошо, я думаю, что я до сих пор пытаюсь понять эту проблему. Но я думаю, что, когда вы получаете доступ к базе данных, вы можете сохранить итоговые значения для XTSM, XTS, XRX и XHAN.

Или просто вычислить COUNT, где XTSM «?» (в подготовленном состоянии).Я понимаю, что, возможно, это большая часть базы данных, которая уже достаточно велика.

В любом случае, вы также можете сделать это в java, поскольку в последнем цикле for, i == COUNT. Кстати, ваш псевдокод должен определять XTS в XTSM, потому что если он не будет путешествовать по всем XTS в базе данных, не все XTS, связанные с вашим конкретным XTSM.

Больше идей в ваших четырех форсах (я всегда хотел сказать это :)), вы могли бы добавить какие-то значения ifs в счетчик, так что вы знаете, если вы зацикливаете XTS, который имеет логическое отношение с XTSM и снова в конце цикла i = COUNT.

Немного больше информации было бы здорово, поскольку я думаю, что я не разбираюсь в проблеме подробно. Как вы извлекаете данные из базы данных? У вас есть класс, который хранит это? Возможно, вы могли бы сделать некоторые методы, чтобы вычислить это.

Я думаю, что простой класс

общественный класс Foo { INT XTSM; int XTS; int XRX; int XHAN; }

, а затем хранить все строки в списке (или вектор, или карту, что-то итерация), счетные элементы списка, которые имеют XTSM = х и XTS = у бы это сделать более или менее то, что вы пытаются сделать?

Редактировать: может быть, этот код помогает, не знаю, если это то, что вы ищете ... allthought Я думаю, может быть, какой-то PL (если вы в ORACLE), то делайте это быстрее. Во всяком случае, некоторый код jave ...

public class Foo { 
int XTSM; 
int XTS; 
int XRX; 
int XHAN; 
LinkedList lk;//maybe not a good idea to have it here 
//but hey, it's a 30seconds thought... 

public void getItAll() throws Exception{//mostly SQLException, but any you need 
    Connection conn=null; 
    //make the connection 

    String query="SELECT XTSM, XTS, XRX, XHAN " + 
      " FROM your_table" + 
      " WHERE 1=1" + 
      " AND 1=1";//add stuff you need to the query 

    Statement stmt= conn.createStatement(); 
    ResultSet rst = stmt.executeQuery(query); 
    Foo f = null; 
    while(rst.next()){ 
     f = new Foo(); 
     //yeah, you should have getters and setters 
     f.XTSM = rst.getInt("XSTM"); 
     f.XTS = rst.getInt("XST"); 
     f.XRX = rst.getInt("XRX"); 
     f.XHAN = rst.getInt("XHAN"); 
     this.lk.add(f); 
     //this gives you all the table in a list (especifically a linkedlist 
    } 
} 
public void calculateItAll() throws Exception{//some exception, probably IO? 
    Foo f = null; 
    int count =0; 
    for(int i=0; i< this.lk.size(); i++){//we iterate through all the table 
     f = new Foo(); 
     f = (Foo)this.lk.get(i); 
     count = 0; 
     for(int j=0; j<=200;j++){//XSTM 
      if(f.XTSM == j){//I keep thinking that getters are good 
       for(int k=0; k<=2;k++){//XST 
        if(f.XTS == k){//do the getters, really 
         for(int m=0;m<=3;m++){//XRX 
          if(f.XRX==m){//add funny comment about getters 
           for(int n=0;n<=7;n++){//XHAN 
            if(f.XHAN==n){//man, so good that is almost finished 
             count++; 
            }//end of if 
           }//end of XHAN 
          }//end of if 
         }//end of XRX 
        }//end of if 
       }//end ofXST 
      }//end of if 
     }//end of XSTM 
     //here you write the count and all the Foo somewhere 
    } 
}} 
+0

это очень ясно; вы можете видеть ответ «Конспектный компилятор», он очень хорошо понимает, и его ответ правильный; но, к сожалению, это с Perl ... – Freeman

+0

Отредактировано, с некоторым кодом java, это то, что вы ищете? – Random

+0

+1 этот подход действительно заслуживает повышения. – stacker

Смежные вопросы