import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


public class Sample {

	private List<String> header;

	private List<List<String>> data;

	public Sample(String str) {
		boolean isFirst = true;
		String[] lines = str.split("\n");
		data = new ArrayList<List<String>>(lines.length - 1);
		for (String line : str.split("\n")) {
			List<String> row = Arrays.asList(line.split("\t"));
			if (isFirst && !(isFirst = false)) {
				header = row;
			} else {
				data.add(row);
			}
		}
	}

	public Sample sort(final int column) {
		Collections.sort(data, new Comparator<List<String>>() {
			public int compare(List<String> l, List<String> r) {
				return r.get(column).compareTo(l.get(column));
			}
		});
		return this;
	}

	public Sample swapColumn(final int column1, final int column2) {
		List<List<String>> list = new ArrayList<List<String>>(data);
		list.add(0, header);
		forAll(list, new Closure() {
			public void each(List<String> row) {
				row.set(column1, row.set(column2, row.get(column1)));
			}
		});
		return this;
	}

	public Sample addValue(final int column, final int add) {
		forAll(new Closure() {
			public void each(List<String> row) {
				row.set(column,
					Integer.toString(Integer.parseInt(row.get(column)) + add)); 
			}
		});
		return this;
	}

	private void forAll(Closure c) {
		forAll(data, c);
	}

	private void forAll(List<List<String>> list, Closure c) {
		for (List<String> row : list) {
			c.each(row);
		}
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append(join(header)).append("\n");
		for (List<String> row : data) {
			builder.append(join(row)).append("\n");
		}
		return builder.toString();
	}

	private String join(List<String> list) {
		StringBuilder builder = new StringBuilder();
		boolean isFirst = true;
		for (String str : list) {
			if (!isFirst) {
				builder.append("\t");
			} else {
				isFirst = false;
			}
			builder.append(str);
		}
		return builder.toString();
	}

	private static interface Closure {
		public void each(List<String> row);
	}

	public static void main(String[] args) {
		String str =
			"ID\tSurname\tForename\tAge\n" +
			"1\tSato\tHanako\t17\n" +
			"0\tSuzuki\tTaro\t18\n";
		System.out.println(
			new Sample(str).sort(1).swapColumn(1, 2).addValue(3, 1));
	}
}
