2017-02-05 1 views
1

У меня есть два метода, которые почти идентичны. Я хотел бы знать, есть ли способ объединить эти 2 метода в 1, что позволило бы мне отображать оба типа карт в качестве параметра. Методы записываются в файл excel. Ключ - заголовок excel (все клавиши идут в первой строке), а отображаемый список - все под каждой клавишей (данные). Какие-нибудь уникальные идеи?Java предотвращает дублирование метода для той же цели - разные параметры

private void test(Sheet sheet, HashMap<String, List<Double>> map) { 
     for (String var : map.keySet()) { 
      int rowNumb=0; 
      Row row = sheet.getRow(rowNumb); 
      Cell cell = row.createCell(currColumn); 
      cell.setCellValue(var); 
      rowNumb++; 
      List<Double> list = map.get(var); 
      for (int i = 0; i < list.size(); i++) { 
       row = sheet.getRow(rowNumb); 
       cell = row.createCell(currColumn); 
       cell.setCellValue(list.get(i)); 
      } 
      currColumn++; 
     } 
    } 



private void test(Sheet sheet, HashMap<String, List<String>> map) { <-- takes in String list rather thand Double. 
     for (String var : map.keySet()) { 
      int rowNumb=0; 
      Row row = sheet.getRow(rowNumb); 
      Cell cell = row.createCell(currColumn); 
      cell.setCellValue(var); 
      rowNumb++; 
      List<String> list = map.get(var);   <---- Only thing that is different 
      for (int i = 0; i < list.size(); i++) { 
       row = sheet.getRow(rowNumb); 
       cell = row.createCell(currColumn); 
       cell.setCellValue(list.get(i)); 
      } 
      currColumn++; 
     } 
    } 
+1

Первая идея: используйте дженерики. Вопросы: что такое 'currColumn',' row' и 'cell' - где они определены? – luk2302

+0

Ах, дерьмо, я извлек некоторые вещи в первой половине метода, чтобы было легче читать. –

+0

Возможно, работайте, может быть, нет, но вы можете попробовать этот инструмент: https://pmd.github.io/pmd-5.5.2/usage/cpd-usage.html – Zack

ответ

4

Вы должны использовать дженерики:

private <T> void test(Sheet sheet, HashMap<String, List<T>> map) { 
    for (String var : map.keySet()) { 
     List<T> list = map.get(var); 
     for (int i = 0; i < list.size(); i++) { 
      row = sheet.getRow(i); 
      cell = row.createCell(currColumn); 
      cell.setCellValue(list.get(i)); 
     } 
     currColumn++; 
    } 
} 

Где бы вы ранее помещайте ссылки на String и Double сейчас ставят T.

+0

Спасибо. Проблема, с которой я столкнулась, - это последняя строка: cell.setCellValue (list.get (i)); setCellValue() не знает, что делать, если это тип Т. Он нуждается в типе String или типа double, между прочим. Это POI пакета Apachi для написания, чтобы преуспеть, если это имеет значение. –

+0

Хорошо, это работает: cell.setCellValue (list.get (i) .toString()); , благодаря! –

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