Это решение проблемы индекса KWI C, где список заголовков или предложений должен быть циклически сдвинут, отсортирован по алфавиту, а затем записан в файл. При перемещении заголовка это делается путем удаления первого слова в предложении и добавления его в конец строки. Это повторяется до тех пор, пока не будут созданы все возможные изменения. Это моя попытка решить эту проблему с помощью канала и фильтра, соответствует ли она ограничениям архитектуры канала и фильтра?
При кодировании решения канала и фильтра всегда требуется явное кодирование каналов? Можно ли просто объединить фильтры в вызове метода в основном?
private List<String> input(String filename) {
List<String> data = new ArrayList<>();
try {
BufferedReader br = new BufferedReader(new FileReader(filename));
String line;
while((line = br.readLine()) != null) {
data.add(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
private List<String> circularShift(List<String> data) {
List<String> shifts = new ArrayList<>();
//for every line
for (String line : data) {
//create circular shifts
String[] lineAsArr = line.split(" ");
List<String> shiftedLine;
//for every word in line
for(int i=0; i < lineAsArr.length; i++) {
//create new circular shift (shiftedLine)
shiftedLine = new ArrayList<String>();
//implement shift and add to shifts shared data
for (int j = i; j < (i + lineAsArr.length); j++)
{
if (j >= lineAsArr.length)
shiftedLine.add(lineAsArr[j-lineAsArr.length]);
else
shiftedLine.add(lineAsArr[j]);
}
shifts.add(shiftedLine.toString());
}
}
return shifts;
}
private List<String> alphabetise(List<String> shifts) {
for(int i=0; i < shifts.size(); i++) {
for(int j=1; j < shifts.size()-i; j++) {
String line1 = shifts.get(j-1);
String line2 = shifts.get(j);
if(line1.toLowerCase().compareTo(line2.toLowerCase()) > 0) {
String temp = shifts.get(j-1);
shifts.remove(j-1);
shifts.add(j,temp);
}
}
}
return shifts;
}
//FIXME Returns void?
private void output(List<String> shifts) {
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("P&FOutput.txt"));
for (String shift : shifts) {
bw.write(shift);
bw.newLine();
}
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Pipeline run = new Pipeline();
run.output(run.alphabetise(run.circularShift(run.input("ProgramInput"))));
}