/**
 * A class that contains examples of the use of segmented (or packed)
 * arrays.
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
public class SegmentedArrays {
    
    /**
     * A method to hold the fragments.
     *
     * @param args  The command line arguments
     */
    public static void main(String[] args) {
        double[] height = {0.0, 0.0, 0.0, 0.0};
        double[] weight = {0.0, 0.0, 0.0, 0.0};
        {
        int recordSize = 2;
        int field, record;

        int n = args.length;
//[args1
        for (int index = 0; index < n; ++index) {
            record = index / recordSize;
            field  = index % recordSize;
            
            if (field == 0) {
                height[record] = Double.parseDouble(args[index]);
            } else {
                weight[record] = Double.parseDouble(args[index]);
            }
        }
//]args1
        }
        
        double h, w;
//[args2
        h = Double.parseDouble(args[toIndex(1, 0, 2)]);
        w = Double.parseDouble(args[toIndex(1, 1, 2)]);
//]args2
        System.out.println(h + "\t" + w);
        
        System.out.println("From args to conformal...");
        {
//[args3
        int recordSize = 2;
        int records = args.length / recordSize;
        
        for (int r = 0; r < records; ++r) {
            height[r] = Double.parseDouble(args[toIndex(r, 0, recordSize)]);
            weight[r] = Double.parseDouble(args[toIndex(r, 1, recordSize)]);
        }
//]args3
        for (int r = 0; r < records; ++r) {
            System.out.println(height[r] + "\t" + weight[r]);
        }
        System.out.println();
        }
        
        
        
//[data
        double[] heights = { 60.0,  62.0,  65.0,  70.0};
        double[] weights = {100.0, 110.0, 120.0, 140.0};
//]data        
                



//[letters
        String[] upper = {"A", "B", "C", "D"};
        String[] lower = {"a", "b", "c", "d"};
//]letters
        
        {
            double[] interleaved = new double[8];
//[interleave
            int n = 4;
            for (int i = 0; i < n; ++i) {
                interleaved[2 * i]     = height[i];
                interleaved[2 * i + 1] = weight[i];
            }
//]interleave
            System.out.println("Interleaved");
            for (int i = 0; i < n * 2; ++i) {
                System.out.print(interleaved[i]+"\t");
            }
            System.out.println();
        }
        
        
        {
            double[] concatenated = new double[8];
//[concatenate1
            int n = 4;
            for (int i = 0; i < n; ++i) {
                concatenated[i]     = height[i];
                concatenated[n + i] = weight[i];
            }
//]concatenate1
            System.out.println("Concatenated (One Loop)");
            for (int i = 0; i < n * 2; ++i) {
                System.out.print(concatenated[i] + "\t");
            }
            
            System.out.println();
        }
        
        
        {
            double[] concatenated = new double[8];
//[concatenate2
            int n = 4;
            for (int i = 0; i < n; ++i) {
                concatenated[i]   = height[i];
            }

            for (int i = 0; i < n; ++i) {
                concatenated[n + i] = weight[i];
            }
//]concatenate2
            System.out.println("Concatenated (Two Loops)");
            for (int i = 0; i < n * 2; ++i) {
                System.out.print(concatenated[i] + "\t");
            }
            System.out.println();
        }
        

        {
            int recordSize = 2;
            int index = 2;
            int record = 2;
            int field  = 1;
  
//[toIndex
            index = (record * recordSize) + field;
//]toIndex
  
//[fromIndex
            record = index / recordSize;
            field  = index % recordSize;
//]fromIndex
        }
        
    }
//[method
    /**
     * Calculate the index in an interleaved segmented array
     * from the record number, field number, and record size.
     *
     * @param record      The record number
     * @param field       The field number
     * @param recordSize  The number of fields in a record
     * @return The index
     */
    public static int toIndex(int record, int field, int recordSize) {
        return (record * recordSize) + field;
    }
//]method

}
