如何从两个数组中交替获取字符?

huangapple go评论101阅读模式
英文:

How do I alternate chars from two arrays?

问题

  1. char[] ch3 = new char[ch1.length + ch2.length];
  2. int count = 0;
  3. int count2 = 0;
  4. for(int i = 0; i < ch3.length; i++){
  5. if(i < ch1.length) {
  6. if(i%2 == 0 || count2 == ch2.length) {
  7. ch3[i] = ch1[count];
  8. count++;
  9. }
  10. }
  11. if(i < ch2.length) {
  12. if(i%2 != 0 || count == ch1.length) {
  13. ch3[i] = ch2[count2];
  14. count2++;
  15. }
  16. }
  17. }
  18. return ch3;
英文:

I need help with figuring out how to combine two char arrays and then have the elements alternate in a new array. The given arrays can be different lengths, for example: char1=[B,D] char2 = [c,R,5] the output should be char3= [B,c,D,r,5]

  1. char[] ch3 = new char[ch1.length + ch2.length];
  2. int count = 0;
  3. int count2 = 0;
  4. for(int i = 0; i &lt; ch3.length; i++){
  5. if(i &lt; ch1.length) {
  6. if(i%2 == 0 || count2 == ch2.length) {
  7. ch3[i] = ch1[count];
  8. count++;
  9. }
  10. }
  11. if(i &lt;ch2.length) {
  12. if(i%2 != 0 || count == ch1.length) {
  13. ch3[i] = ch2[count2];
  14. count2++;
  15. }
  16. }
  17. }
  18. return ch3;

答案1

得分: 1

  1. public static void main(String... args) {
  2. int[] one = { 1, 2, 3 };
  3. int[] two = { 44, 55, 66, 77, 88 };
  4. System.out.println(Arrays.toString(alternate(one, two)));
  5. }
  6. public static int[] alternate(int[] one, int[] two) {
  7. int[] res = new int[one.length + two.length];
  8. for (int i = 0, j = 0, k = 0; i < res.length; i++) {
  9. if (i % 2 == 0) {
  10. if (j < one.length)
  11. res[i] = one[j++];
  12. else
  13. res[i] = two[k++];
  14. } else {
  15. if (k < two.length)
  16. res[i] = two[k++];
  17. else
  18. res[i] = one[j++];
  19. }
  20. }
  21. return res;
  22. }

Output:

  1. [1, 44, 2, 55, 3, 66, 77, 88]
英文:
  1. public static void main(String... args) {
  2. int[] one = { 1, 2, 3 };
  3. int[] two = { 44, 55, 66, 77, 88 };
  4. System.out.println(Arrays.toString(alternate(one, two)));
  5. }
  6. public static int[] alternate(int[] one, int[] two) {
  7. // result array length is sum of lengths of given arrays.
  8. int[] res = new int[one.length + two.length];
  9. // i - result array iterator
  10. // j - one array iterator
  11. // k - two array iterarot
  12. for (int i = 0, j = 0, k = 0; i &lt; res.length; i++) {
  13. // for even position we put next element from one array
  14. if (i % 2 == 0)
  15. // if one array has more elements - add it
  16. // if no more elements in one array, add next element from two array
  17. if (j &lt; one.length)
  18. res[i] = one[j++];
  19. else
  20. res[i] = two[k++];
  21. // for odd position we put next element from two array
  22. else
  23. // if two array has more elements - add it
  24. // if no more elements in two array, add next element from one array
  25. if (k &lt; two.length)
  26. res[i] = two[k++];
  27. else
  28. res[i] = one[j++];
  29. }
  30. return res;
  31. }

Output:

  1. [1, 44, 2, 55, 3, 66, 77, 88]

答案2

得分: 1

  1. public static int[] alternate(int[] a1, int[] a2) {
  2. int[] a3 = new int[a1.length + a2.length];
  3. for (int i1 = 0, i2 = 0, i3 = 0; i3 < a3.length; ) {
  4. if (i1 < a1.length)
  5. a3[i3++] = a1[i1++];
  6. if (i2 < a2.length)
  7. a3[i3++] = a2[i2++];
  8. }
  9. return a3;
  10. }
  11. System.out.println(Arrays.toString(alternate(
  12. new int[] { 1, 2, 3 },
  13. new int[] { 44, 55, 66, 77, 88 })));
  14. System.out.println(Arrays.toString(alternate(
  15. new int[] { 44, 55, 66, 77, 88 },
  16. new int[] { 1, 2, 3 })));
  17. [1, 44, 2, 55, 3, 66, 77, 88]
  18. [44, 1, 55, 2, 66, 3, 77, 88]
  19. public static int[] alternate(int[]... arrays) {
  20. int[] result = new int[Stream.of(arrays).mapToInt(a -> a.length).sum()];
  21. int[] ai = new int[arrays.length];
  22. for (int j = 0; j < result.length; )
  23. for (int i = 0; i < arrays.length; i++)
  24. if (ai[i] < arrays[i].length)
  25. result[j++] = arrays[i][ai[i]++];
  26. return result;
  27. }
  28. System.out.println(Arrays.toString(alternate(
  29. new int[] { 1, 2, 3 },
  30. new int[] { 44, 55, 66, 77, 88 },
  31. new int[] { 12, 34 },
  32. new int[] { 5, 6, 7, 8 })));
  33. [1, 44, 12, 5, 2, 55, 34, 6, 3, 66, 7, 77, 8, 88]
  34. @SafeVarargs
  35. public static <T> List<T> alternate(Iterable<? extends T>... inputs) {
  36. List<T> result = new ArrayList<>();
  37. @SuppressWarnings("unchecked")
  38. Iterator<? extends T>[] iter = new Iterator[inputs.length];
  39. for (int i = 0; i < inputs.length; i++)
  40. iter[i] = inputs[i].iterator();
  41. for (int prevSize = -1; prevSize < result.size(); ) {
  42. prevSize = result.size();
  43. for (int i = 0; i < inputs.length; i++)
  44. if (iter[i].hasNext())
  45. result.add(iter[i].next());
  46. }
  47. return result;
  48. }
  49. public static <T> List<T> alternate(Collection<? extends Iterable<? extends T>> inputs) {
  50. @SuppressWarnings("unchecked")
  51. Iterable<? extends T>[] iterables = inputs.toArray(new Iterable[0]);
  52. return alternate(iterables);
  53. }
  54. System.out.println(alternate(
  55. Arrays.asList(1, 2, 3),
  56. Arrays.asList(44, 55, 66, 77, 88),
  57. Arrays.asList(12, 34),
  58. Arrays.asList(5, 6, 7, 8)));
  59. System.out.println(alternate(Arrays.asList(
  60. Arrays.asList(1, 2, 3),
  61. Arrays.asList(44, 55, 66, 77, 88),
  62. Arrays.asList(12, 34),
  63. Arrays.asList(5, 6, 7, 8))));
  64. [1, 44, 12, 5, 2, 55, 34, 6, 3, 66, 7, 77, 8, 88]
  65. [1, 44, 12, 5, 2, 55, 34, 6, 3, 66, 7, 77, 8, 88]
英文:

Similar solution to answer by oleg.cherednik, but without the need for slow % remainder operator.

  1. public static int[] alternate(int[] a1, int[] a2) {
  2. int[] a3 = new int[a1.length + a2.length];
  3. for (int i1 = 0, i2 = 0, i3 = 0; i3 &lt; a3.length; ) {
  4. if (i1 &lt; a1.length)
  5. a3[i3++] = a1[i1++];
  6. if (i2 &lt; a2.length)
  7. a3[i3++] = a2[i2++];
  8. }
  9. return a3;
  10. }

Tests

  1. System.out.println(Arrays.toString(alternate(
  2. new int[] { 1, 2, 3 },
  3. new int[] { 44, 55, 66, 77, 88 })));
  4. System.out.println(Arrays.toString(alternate(
  5. new int[] { 44, 55, 66, 77, 88 },
  6. new int[] { 1, 2, 3 })));

Output

  1. [1, 44, 2, 55, 3, 66, 77, 88]
  2. [44, 1, 55, 2, 66, 3, 77, 88]

UPDATE

This algorithm can easily be enhanced to merge many arrays:

  1. public static int[] alternate(int[]... arrays) {
  2. int[] result = new int[Stream.of(arrays).mapToInt(a -&gt; a.length).sum()];
  3. int[] ai = new int[arrays.length];
  4. for (int j = 0; j &lt; result.length; )
  5. for (int i = 0; i &lt; arrays.length; i++)
  6. if (ai[i] &lt; arrays[i].length)
  7. result[j++] = arrays[i][ai[i]++];
  8. return result;
  9. }

Test

  1. System.out.println(Arrays.toString(alternate(
  2. new int[] { 1, 2, 3 },
  3. new int[] { 44, 55, 66, 77, 88 },
  4. new int[] { 12, 34 },
  5. new int[] { 5, 6, 7, 8 })));

Output

  1. [1, 44, 12, 5, 2, 55, 34, 6, 3, 66, 7, 77, 8, 88]

UPDATE 2

It can also be done for collections:

  1. @SafeVarargs
  2. public static &lt;T&gt; List&lt;T&gt; alternate(Iterable&lt;? extends T&gt;... inputs) {
  3. List&lt;T&gt; result = new ArrayList&lt;&gt;();
  4. @SuppressWarnings(&quot;unchecked&quot;)
  5. Iterator&lt;? extends T&gt;[] iter = new Iterator[inputs.length];
  6. for (int i = 0; i &lt; inputs.length; i++)
  7. iter[i] = inputs[i].iterator();
  8. for (int prevSize = -1; prevSize &lt; result.size(); ) {
  9. prevSize = result.size();
  10. for (int i = 0; i &lt; inputs.length; i++)
  11. if (iter[i].hasNext())
  12. result.add(iter[i].next());
  13. }
  14. return result;
  15. }
  16. public static &lt;T&gt; List&lt;T&gt; alternate(Collection&lt;? extends Iterable&lt;? extends T&gt;&gt; inputs) {
  17. @SuppressWarnings(&quot;unchecked&quot;)
  18. Iterable&lt;? extends T&gt;[] iterables = inputs.toArray(new Iterable[0]);
  19. return alternate(iterables);
  20. }

Tests

  1. System.out.println(alternate(
  2. Arrays.asList(1, 2, 3),
  3. Arrays.asList(44, 55, 66, 77, 88),
  4. Arrays.asList(12, 34),
  5. Arrays.asList(5, 6, 7, 8)));
  6. System.out.println(alternate(Arrays.asList(
  7. Arrays.asList(1, 2, 3),
  8. Arrays.asList(44, 55, 66, 77, 88),
  9. Arrays.asList(12, 34),
  10. Arrays.asList(5, 6, 7, 8))));

Output

  1. [1, 44, 12, 5, 2, 55, 34, 6, 3, 66, 7, 77, 8, 88]
  2. [1, 44, 12, 5, 2, 55, 34, 6, 3, 66, 7, 77, 8, 88]

huangapple
  • 本文由 发表于 2020年10月10日 05:48:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/64287729.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定